zoukankan      html  css  js  c++  java
  • Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别

    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]
  • 相关阅读:
    Linux下利用rsync实现多服务器文件同步
    SVN使用import导入新数据到版本库
    SVN协同开发时服务端与线上APACHE测试环境网站同步记录 转
    [转]rsync的配置与应用
    Matrix 旋转mc 注册点在mc的左上角
    多边形面积计算
    【神奇的代码】
    【碰撞回弹】
    三角函数
    判断点是否在线段或直线上
  • 原文地址:https://www.cnblogs.com/libingql/p/4676865.html
Copyright © 2011-2022 走看看