IQueryable<T>
和IEnumerable<T>
什麼區別? html
另請參見與該問題重疊的IQueryable和IEnumerable之間有什麼區別 。 數據庫
IEnumerable: IEnumerable最適合用於內存中的收集(或本地查詢)。 IEnumerable不會在項目之間移動,它是僅轉發集合。 編程
IQueryable: IQueryable最適合於遠程數據源,例如數據庫或Web服務(或遠程查詢)。 IQueryable是一項很是強大的功能,可啓用各類有趣的延遲執行方案(例如基於分頁和基於組合的查詢)。 服務器
所以,當您只須要簡單地遍歷內存中的集合時,請使用IEnumerable,若是您須要對集合進行任何操做(如數據集和其餘數據源),請使用IQueryable 網絡
IEnumerable引用了一個集合,可是IQueryable只是一個查詢,它將在Expression Tree內生成。咱們將運行此查詢從數據庫中獲取數據。 框架
簡而言之,另外一個主要區別是IEnumerable在服務器端執行select查詢,在客戶端加載內存中的數據,而後過濾數據,而IQueryable在服務器端使用全部過濾器執行select查詢。 spa
這是我在相似帖子(關於此主題)上寫的內容。 (不,我一般不引述本身,但這是很是好的文章。) 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表達式。 」。
這是youtube上的精彩視頻 ,展現了這些界面的不一樣之處,值得一看。
下面爲它提供了一個長的描述性答案。
要記住的第一個重要點是IQueryable
接口繼承自IEnumerable
,所以,不管IEnumerable
能夠作什麼, IQueryable
均可以作到。
差別不少,但讓咱們討論一個最大的差別。 當使用LINQ
或Entity框架加載您的集合而且您要在集合上應用過濾器時, IEnumerable
接口很是有用。
考慮下面的簡單代碼,它將IEnumerable
與實體框架一塊兒使用。 它使用Where
過濾器來獲取EmpId
爲2
記錄。
EmpEntities ent = new EmpEntities(); IEnumerable<Employee> emp = ent.Employees; IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
在IEnumerable
代碼所在的客戶端上執行過濾器的位置。 換句話說,全部數據都是從數據庫中獲取的,而後在客戶端進行掃描並得到EmpId
爲2
的記錄。
可是如今看下面的代碼,咱們將IEnumerable
更改成IQueryable
。 它在服務器端建立一個SQL查詢,而且僅將必要的數據發送到客戶端。
EmpEntities ent = new EmpEntities(); IQueryable<Employee> emp = ent.Employees; IQueryable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
所以, IQueryable
和IEnumerable
之間的區別在於執行過濾器邏輯的位置。 一個在客戶端執行,另外一個在數據庫上執行。
所以,若是僅使用內存數據收集,則IEnumerable
是一個不錯的選擇,可是若是要查詢與數據庫鏈接的數據收集,則IQueryable是一個更好的選擇,由於它減小了網絡流量並使用了SQL語言的強大功能。