Entity Framework中使用IEnumerable、IQueryable及IList的区别 1. IEnumerable 2. IQueryable 3. IList

  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]