第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html; 第二篇:https://www.cnblogs.com/shenbing/p/5394228.html 第三篇:https://blog.csdn.net/ydm19891101/articl ...
第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html;
第二篇:https://www.cnblogs.com/shenbing/p/5394228.html
第三篇:https://blog.csdn.net/ydm19891101/article/details/50969323
第四篇:http://www.igiven.com/?p=2804 (這篇最好,闡釋最詳盡,最透徹)
下麵內容摘自上面第4篇博客,非本人原創:
那麼什麼時候用IQueryable,什麼時候用IEnumerable?
1.Func<>謂詞表達式,就是一個委托,委托一旦調用,就立即執行了,將執行結果保存在記憶體中。
2.Expression是一個表達式,會存儲拼接表達式樹,直到在運行期最終執行。
那麼在EF中我們根據條件查詢數據時,不應該把數據一次性載入到本地記憶體中,然後再本地記憶體中進行篩選,如果數據量大了,就崩潰了。
我們需要將表達式組合好,然後再一起提交到資料庫執行,返回查詢結果。
(每次在執行where查詢操作符的時候IQueryProvider會為我們創建一個新的IQueryable,調用AsEnumerable()方法的時候並不會去實際取值,只是
得到了一個IEnumerable,所以EF在查詢數據時候不要先取IEnumerable再去篩選數據。執行ToList方法時才會去真正調用迭代器GetEnumerator()
取值。真正取值時候,會去執行IQueryProvider中的Excute方法.(解析表達式,然後執行取得結果))
這就是IQueryable的延遲載入把.
.知識點總結
(1) 解決查詢多次的問題,因IQueryable延遲載入,當用到集合的時候,provider會解析表達式,然後生成查詢,所以會走一個複雜的過程。
(2) 本地集合:List,Array,IEnumable都是本地集合,都是緩存在裡面的
(3) 使用EF管理上下文實例的最佳選擇是線程的唯一。
(4) IEnumerable介面是一個公開枚舉器,該枚舉器支持在指定的集合上進行簡單迭代,也就是次介面可以直接使用foreach遍歷次Object。