天天看點

Linq之IQueryable接口與IEnumberable差別

公開枚舉器,該枚舉器支援在指定類型的集合上進行簡單疊代。也就是說:實作了此接口的object,就可以直接使用foreach周遊此object;

 ienumerable 包含一個方法,getenumerator,傳回 ienumerator。 ienumerator 可以通過集合循環顯示 current 屬性和 movenext 和 reset 方法。

它是一個最優方法實作 ienumerable 和 ienumerator 在集合選件類啟用 foreach (for each 在 visual basic 中為) 文法,但是,ienumerable 不需要實作。 如果集合中不實作 ienumerable,您還必須遵循疊代器窗體通過提供傳回接口、選件類或結構的 getenumerator 方法支援此文法。

iqueryable 接口繼承 ienumerable 接口,以便在前者表示一個查詢時可以枚舉該查詢的結果。 枚舉強制執行與 iqueryable 對象關聯的表達式目錄樹。 “執行表達式目錄樹”的定義是查詢提供程式所特有的。實作iqueryable接口可以實作自己的查詢提供程式。

那麼他們的差別到底在哪兒呢?下面看一個例子:

Linq之IQueryable接口與IEnumberable差別
Linq之IQueryable接口與IEnumberable差別

直接傳回iqueryable接口生成的sql語句

Linq之IQueryable接口與IEnumberable差別

第二種:在用分頁查詢之前先将其轉換成 ienumerable實際執行的sql如下圖所示

Linq之IQueryable接口與IEnumberable差別

    ienumerable<t> 泛型類在調用自己的skip 和 take 等擴充方法之前資料就已經加載在本地記憶體裡了,而iqueryable<t> 是将skip ,take 這些方法表達式翻譯成t-sql語句之後再向sql伺服器發送指令。也是延遲在我要真正顯示資料的時候才執行。

參考文章

https://msdn.microsoft.com/zh-cn/library/system.linq.iqueryable.aspx

https://msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.aspx

http://www.cnblogs.com/chengxiaohui/articles/2088837.html

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/3217514.html