Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的區別

libingql發表於2015-07-25

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]

相關文章