2017-10-06 107 views
0

我在查询使用C#的Azure表存储,它返回一个IEnumerable。我正在使用.Select()从我的结果中获取两个不同的属性,但每个属性的计数都不正确。例如:IEnumerable.Select()返回意外的结果

IEnumerable<SomeClass> results = table.ExecuteQuery(query); 
IEnumerable<DateTime> dates = results.Select(x => x.Date); 
IEnumerable<double> doubles = results.Select(x => x.Doubles); 

每个结果都有日期和一个双值(我已经验证了这一点),所以他们每个人的数量应该是完全一样彼此的结果,但他们回来一样。我可能有300k的成绩,然后是299,997日和300,003双。

当我做这样的事情:

results.ToList(); 

,然后使用。选择()我得到正确的结果。我试图避免首先将记录转换为列表,因为它需要太长时间。我也想避免使用for循环或foreach循环,因为它们也需要很长时间。

我的问题是:有没有一种方法可以在IEnumerable上使用.Select()并获得准确的结果?还是有另一种方法来做到这一点会非常快?

注意:我将这些数据绘制在xy图上,对于约300k条记录,大约需要1分30秒。大约90%的时间是由于我有一个foreach循环。如果我首先转换为列表,则需要更长的时间来处理。在IEnumerable上使用.Select()非常快,但我需要可靠的结果,并且x值的数量必须与y值相同。

+0

在某些行上日期是否等于'DateTime.MinValue'?也许安非他明类兴奋剂正在跳过这一点 –

+1

如何检查每个查询结果的行数?在这两种情况下,你都会返回'IEnumerable',只有当你迭代它时才会执行它。 – Fabio

+0

不。我一直在测试环境中输入这些记录,日期始终是数据发布的当前日期。 – CSchroeder

回答

0

Azure表格/ SDK使用懒惰枚举。当您调用executequery但是当您遍历返回的Ienumerable结果时,实际的对表服务检索实体的http请求不会完成。这是一种可能性,为什么你看到差异的结果,因为你通过选择可能的表上的数据正在改变遍历枚举?