zoukankan      html  css  js  c++  java
  • Entity Framework Core今日所得:避免 IEnumerable 以及 IQueryable 陷阱

    避免 IEnumerable 以及 IQueryable 陷阱:
    IEnumerable示用Linq会先去数据库查询所有记录,然后再条件查询。
    IQueryable接口派生自IEnumerable,但表示数据库应该处理的查询。也就是说IQueryable会把查询的条件写入sql语句,而并不是先取出所有数据后再筛选。
    IQueryable接口的使用改变了对 LINQ 查询的评估方式,并确保筛选是由数据库服务器而不是由 MVC 应用程序执行的。只检索符合筛选条件的数据库中的数据,并且不会创建任何立即丢弃的对象。

    使用IQueryable接口的缺点是容易意外地生成比预期更多的数据库查询。
    比如:
    var products = repository.Products.Where(p => p.Price > 25);
    ViewBag.ProductCount = products.Count();
    在上面代码中,where的时候会触发一次查询,筛选出价格大于25的产品,在下面Count()又会触发一次查询,去数据库内统计价格大于25的产品数量。
    IQueryable接口每次计算时都会触发一个新的查询,Entity Framework Core 对 LINQ 查询没有足够的洞察力,无法意识到这两个数据操作可以使用单个数据库查询来处理。在这种情况下,可以通过使用ToArray或ToList方法将IQueryable对象转换为常规的IEnumerable来避免额外的查询。
    ToArray方法强制对查询进行计算,并生成一个对象集合,这些对象可以在不触发其他查询的情况下进一步处理,这意味着Count方法对已经从数据库检索的数据进行操作,而不是触发新的查询。

  • 相关阅读:
    pip换国内源
    docker build 的 cache 机制
    jenkins 修改log路径
    lsb_release: command not found 解决
    Linux 添加开机启动项的三种方法
    FAT AP v200R005 配置二层透明模式(web&命令行,开局)
    SharePoint 2010 文档管理系列之星级评论功能
    SharePoint 2010 文档管理之过期归档工具
    SharePoint 2010 文档管理系列之文档搜索
    SharePoint 2010 文档管理系列之准备篇
  • 原文地址:https://www.cnblogs.com/dbxiaobai/p/11061246.html
Copyright © 2011-2022 走看看