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() 時,因為還沒被列舉化,代表資料還沒被篩選過,所以才會抓到不如預期的資料。
真是不經一事,不長一智...
參考資料:搞搞就懂
沒有留言:
張貼留言