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


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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM