zoukankan      html  css  js  c++  java
  • 【转载】IQueryable和IEnumerable

    IQueryable和IEnumerable

     

    使用EF你必须知道这两个的区别,可以帮助我们的提升性能。

    表达树:Linq 表达

    IQueryable和IEnumerable

    IQueryable

    延时执行;扩展方法接受的是Expression(必须要能转成sql,否则报错)

    IEnumerable

    延时执行;扩展方法接受的是Func(C#语法)

    ②AsEnumerable() 和 ToList() 的区别

    ToList()

    立即执行,加载数据到内存中。

    AsEnumerable()

    延迟执行,真正使用时才加载数据。对IQueryable对象使用AsEnumerable()后,仍然是延迟执行

    IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别。

    1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功

    使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,只是在内存中进行过滤和排序操作。

    2.IQueryable却总能只提供你所需要的数 据.大大减少了数据的传输

    IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式树中,只有当真正遍历发生的时候,才会将表达式树由IQueryProvider执行获取数据操作。

    注:foreach针对的是数据集整体对象(枚举器?)。当使用foreach时,不管是iq对象还是ie对象,它们都是查询数据库一次,然后开始循环,直至循环结束。不过,当后续再次使用iq对象或ie对象的具体数据时,它们仍然会再次查询数据库。

     

    列如:

    复制代码
        [HttpGet]
            public async Task<IHttpActionResult> Init3()
            {
                IQueryable<JoinA> joins = db.JoinAs.Where(x => x.ACode == "004");
                var joins2 = joins.Where(x=>x.AName.Contains("测试"));
                foreach (var item in joins2)
                {
                    Console.WriteLine(item.Id);
                }
                IEnumerable<JoinA> joinsE = db.JoinAs.Where(x => x.ACode == "004").AsEnumerable();
                var joinsE2 = joinsE.Where(x => x.AName.Contains("测试"));
                foreach (var item in joinsE2)
                {
                    Console.WriteLine(item.Id);
                }
                return await Task.FromResult(Ok(""));
            }
    复制代码

    SQL Server Profiler工具 查看我们的sql语句

    IQueryable:会拼接我们的sql,最后执行

    IEnumerable:先查询到内存中,然后进行操作

     

    SQL Server Profiler工具: https://www.cnblogs.com/kissdodog/p/3398523.html

  • 相关阅读:
    Angular2基础03: 理解依赖注入
    关于HTPP状态码的实践:307的使用
    Angular2基础03:如何重置表单的验证状态?
    Angular2基础02:模板引用变量的使用
    Angular2基础01:理解及时编译(JIT)
    cordova05:配置应用图标与启动画面
    连续子数组的最大和
    从1到整数n中1出现的次数
    滑动窗口的最大值
    矩阵中的路径
  • 原文地址:https://www.cnblogs.com/LifeDecidesHappiness/p/15607395.html
Copyright © 2011-2022 走看看