2011-10-06 22 views
0

我的代碼:獲取後的IQueryable收集的實際計數鮮明的()

IQueryable<string> keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct(); 
int count = keys.Count(); 

收集keys具有正常的集合不同,它的良好的售後服務。 但在keys.Count(),我有沒有不同的表的所有行的數量。 我的ORM是NHibernate。

我該怎麼做才能真正計數IQueryable集合?(無需轉換爲其他收集類型)

謝謝!

+0

如果你的LINQ提供程序最終產生SQL,看看那個。它可能會迫使「截然不同」到查詢的末尾,這顯然會返回「錯誤」的結果。 – dlev

回答

0

看來你的查詢提供者是越野車,你應該報告這個bug。

與此同時,正確計數的一種方法是使用keys.AsEnumerable().Count()。但是,這將導致整個集合的評估。所以,如果最終的集合有很多項目,您將檢索它們以獲得計數。

你可以嘗試的另一種方法是使用keys.GroupBy(k => k).Count()之類的東西,或者在沒有Distinct()的情況下可能也是如此,並希望在這種情況下也不會出現同樣的錯誤。

0

除非對Count()的調用沒有轉換爲只選擇計數的SQL查詢,否則Count()擴展方法必須枚舉所有對象。既然你把鍵放在一個變量中,我假設你以後需要它,可能會枚舉它。所以,你可以全部在這裏,像這樣

string[] keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct().ToArray(); 
int count = keys.Length; 

獲取他們,但我很好奇,在你的榜樣請問這個產品(查詢和結果):

int count = dr.Localization.GetQuery().Select(x => x.Key).Distinct().Count();