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

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/LifeDecidesHappiness/p/15607395.html
Copyright © 2011-2022 走看看