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]
  • 相关阅读:
    anaconda3 notebook for python数据分析-环境搭建
    MySQL之day4
    MySQL之day3
    MySQL之day2
    综合大实验(按需求完成)
    策略路由实验ACL配置
    双点双向重分布实验
    OSPF实验isis协议的设置命令
    OSPFS实验流量优化
    OSPF实验大串连
  • 原文地址:https://www.cnblogs.com/libingql/p/4676865.html
Copyright © 2011-2022 走看看