1. IEnumerable<T>
IEnumerable<T> :對於在內存中集合上運行的方法,返回的可枚舉對象將捕獲傳遞到方法的參數。在枚舉該對象時,將使用查詢運算符的邏輯,並返回查詢結果。
IEnumerable<T>在.Net2.0引入。
IEnumberable使用的是LINQ to Object方式,將AsEnumerable()時對應的所有記錄先加載到內存,再在此基礎上再執行后面的Query。
本地數據源用IEnumerable<T>,並且查詢的邏輯可以直接用你所定義的方法的邏輯。
using (PortalContext context = new PortalContext()) { // 延遲執行 IEnumerable<Category> expr = (from c in context.Categories select c).AsEnumerable().Take(5); foreach (var item in expr) { Console.WriteLine(item.CategoryName); } }
執行的SQL語句:
SELECT [Extent1].[CategoryID] AS [CategoryID], [Extent1].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [Extent1]
IEnumerable<T>是延時執行(Deferred Execution)。
2. IQueryable<T>
IQueryable <T> :不會實現任何查詢行為,但會生成一個表示要執行的查詢的表達式樹。查詢處理由源 IQueryable<T> 對象處理。
IQueryable <T>在.Net支持Linq引入。
遠程數據源用IQueryable<T>,無法直接使用你所定義的方法的邏輯,必須先生成表達式樹,查詢由源對象處理。
using (PortalContext context = new PortalContext()) { // 延遲執行 IQueryable<Category> expr = (from c in context.Categories select c).Take(5); foreach (var item in expr) { Console.WriteLine(item.CategoryName); } }
執行的SQL語句:
SELECT TOP (5) [c].[CategoryID] AS [CategoryID], [c].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [c]
以上實例中,IQueryable<T>查詢使用了LINQ to Sql的處理方式,在遠處數據庫中查詢數據。
IQueryable<T>是延時執行(Deferred Execution)。
3. IList<T>
IList是即時執行(Eager Execution)
using (PortalContext context = new PortalContext()) { // 即時執行 IList<Category> expr = (from c in context.Categories select c).Take(5).ToList(); }
執行的SQL語句:
SELECT TOP (5) [c].[CategoryID] AS [CategoryID], [c].[CategoryName] AS [CategoryName] FROM [dbo].[Category] AS [c]