IQueryable有什麼區別 和IEnumerable ?

IQueryable<T>IEnumerable<T>什麼區別? html


另請參見與該問題重疊的IQueryable和IEnumerable之間有什麼區別數據庫


#1樓

IEnumerable: IEnumerable最適合用於內存中的收集(或本地查詢)。 IEnumerable不會在項目之間移動,它是僅轉發集合。 編程

IQueryable: IQueryable最適合於遠程數據源,例如數據庫或Web服務(或遠程查詢)。 IQueryable是一項很是強大的功能,可啓用各類有趣的延遲執行方案(例如基於分頁和基於組合的查詢)。 服務器

所以,當您只須要簡單地遍歷內存中的集合時,請使用IEnumerable,若是您須要對集合進行任何操做(如數據集和其餘數據源),請使用IQueryable 網絡


#2樓

IEnumerable引用了一個集合,可是IQueryable只是一個查詢,它將在Expression Tree內生成。咱們將運行此查詢從數據庫中獲取數據。 框架


#3樓

簡而言之,另外一個主要區別是IEnumerable在服務器端執行select查詢,在客戶端加載內存中的數據,而後過濾數據,而IQueryable在服務器端使用全部過濾器執行select查詢。 spa


#4樓

這是我在相似帖子(關於此主題)上寫的內容。 (不,我一般不引述本身,但這是很是好的文章。) code

「這篇文章頗有幫助: LINQ-to-SQL中的IQueryable與IEnumerable視頻

引用該文章,「根據MSDN文檔,對IQueryable的調用是經過構建內部表達式樹來進行的。 「這些擴展IQueryable(Of T)的方法不會直接執行任何查詢。相反,它們的功能是構建一個Expression對象,該對象是表示累積查詢的表達式樹。」 htm

表達式樹是C#和.NET平臺上很是重要的構造。 (它們一般很重要,可是C#使它們很是有用。)爲了更好地理解它們之間的區別,建議您在此處閱讀正式C#5.0規範中 表達式語句之間的區別 對於分支到lambda演算的高級理論概念,表達式使對方法的支持成爲一流的對象。 IQueryable和IEnumerable之間的差別圍繞這一點。 IQueryable能夠構建表達式樹,而IEnumerable則不能,至少對於那些不在Microsoft祕密實驗室工做的人而言,至少不是通常而言。

這是另外一篇很是有用的文章,從推與拉角度詳細介紹了差別。 (經過「推」與「拉」,我指的是數據流的方向。.NET和C#的響應式編程技術

這是一篇很是不錯的文章,詳細介紹了語句lambda和表達式lambda之間的區別,並更深刻地討論了表達式tress的概念: 複習C#委託,表達式樹和lambda語句與lambda表達式。 」。


#5樓

這是youtube上的精彩視頻 ,展現了這些界面的不一樣之處,值得一看。

下面爲它提供了一個長的描述性答案。

要記住的第一個重要點是IQueryable接口繼承自IEnumerable ,所以,不管IEnumerable能夠作什麼, IQueryable均可以作到。

在此處輸入圖片說明

差別不少,但讓咱們討論一個最大的差別。 當使用LINQ或Entity框架加載您的集合而且您要在集合上應用過濾器時, IEnumerable接口很是有用。

考慮下面的簡單代碼,它將IEnumerable與實體框架一塊兒使用。 它使用Where過濾器來獲取EmpId2記錄。

EmpEntities ent = new EmpEntities();
IEnumerable<Employee> emp = ent.Employees; 
IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();

IEnumerable代碼所在的客戶端上執行過濾器的位置。 換句話說,全部數據都是從數據庫中獲取的,而後在客戶端進行掃描並得到EmpId2的記錄。

在此處輸入圖片說明

可是如今看下面的代碼,咱們將IEnumerable更改成IQueryable 。 它在服務器端建立一個SQL查詢,而且僅將必要的數據發送到客戶端。

EmpEntities ent = new EmpEntities();
IQueryable<Employee> emp = ent.Employees;
IQueryable<Employee> temp =  emp.Where(x => x.Empid == 2).ToList<Employee>();

在此處輸入圖片說明

所以, IQueryableIEnumerable之間的區別在於執行過濾器邏輯的位置。 一個在客戶端執行,另外一個在數據庫上執行。

所以,若是僅使用內存數據收集,則IEnumerable是一個不錯的選擇,可是若是要查詢與數據庫鏈接的數據收集,則IQueryable是一個更好的選擇,由於它減小了網絡流量並使用了SQL語言的強大功能。

相關文章
相關標籤/搜索