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]