2017-10-06 152 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請求不會完成。這是一種可能性,爲什麼你看到差異的結果,因爲你通過選擇可能的表上的數據正在改變遍歷枚舉?