2016-12-21

[ASP.NET] IQueryable.First() 取不到第一筆資料!?

近日使用 Entity Framework 取資料,取得的資料 myResult 結果是 [0] = "String1",[1] = "String2",[2] = "String3",程式如下:
IQueryable<string> myResult = db.myTable.Select(o => o.Name).Distinct();
然後用 myResult.First(),居然回傳了 String2 !

再來將 myResult 轉成 List 後,myResult.First() 就正確回傳了 String1 !
List<string> myResult = db.myTable.Select(o => o.Name).Distinct().ToList();


IQueryable 跟 List 明明都繼承了 IEnumerable 介面,為何會有此差異?

查了一下它們還真的有差異點:
  • IEnumerable 會將所有資料抓到記憶體,再針對所下的條件做篩選,因此較占記憶體,也因為已經存在記憶體了,所以使用 First() 是抓到正確的資料。
  • IQueryable 則是在把資料列舉化時,才會真正將篩選後的資料取得放到記憶體,因此當使用 First() 時,因為還沒被列舉化,代表資料還沒被篩選過,所以才會抓到不如預期的資料。

真是不經一事,不長一智...



參考資料:搞搞就懂

沒有留言:

張貼留言