上述我们简单讲解了几个小问题,这节我们再来看看如标题EF Core中多次Include导致出现性能的问题,废话少说,直接开门见山。首先依然给出我们上一节的示例类:

接下来我们在控制台进行如下查询:

如上图所示,生成的SQL语句一点毛病都么有,对吧,接下来我们来查询导航属性Posts,如下:

咦,不应该是INNER JOIN吗,但最终生成的SQL语句我们可以看到居然是LEFT JOIN,关键是我们对Post类中的BlogId并未设置为可空,对吧,是不是很有意思。同时通过ORDER BY对两个表的主键都进行了排序。这就是问题的引发点,接下来我们再引入两个类:

上述我们声明了分类和标签,我们知道博客有分类和标签,所以博客类中有对分类和标签的导航属性(这里我们先不关心关系到底是一对一还是一对多等关系),然后修改博客类,如下:

接下来我们再来进行如下查询:

此时和变更追踪没有半毛钱关系,我们看看最终生成的SQL语句,是不是很惊讶,假设单个类中对应多个导航属性,最终生成的SQL语句就是继续LEFT JOIN和ORDER BY,可想其性能将是多么的低下。那么我们应该如何解决这样的问题呢?既然是和Include有关系,每增加一个导航属性即增加一个Include将会增加一个LEFT JOIN和ORDER BY,那么我们何不分开单独查询呢,说完就开干。

此时我们进行如上查询显然不可取,因为直接就到数据库进行SQL查询了,我们需要返回IQueryable才行,同时根据主键查询只能返回一条,所以我们改造成如下查询:

因为接下来还需要从上下文中加载导航属性,所以这里我们需要去掉AsNoTracking,通过上下文加载指定实体导航属性,我们可通过Load方法来加载,如下:

通过上述生成的SQL语句,我们知道这才是我们想要的结果,上述代码看起来有点不是那么好看,似乎没有更加优美的写法了,当然这里我只是在控制台中进行演示,为了吞吐,将上述修改为异步查询则是最佳可行方式。比生成一大堆LEFT JOIN和ORDER BY性能好太多太多。

注意:上述博主采用的是稳定版本3.0.1,其他版本未经测试哦。其实对于查询而言,还是建议采用Dapper或者走底层connection写原生SQL才是最佳,对于单表,用EF Core无可厚非,对于复杂查询还是建议不要用EF Core,生成的SQL很不可控,为了图方便,结果换来的将是CPU飙到飞起。好了,本节我们就到这里,感谢您的阅读,我们下节见。

EntityFramework Core 3多次Include导致查询性能低之解决方案相关推荐

  1. mysql越筛越少_面试官:为什么SELECT * 会导致查询效率低?

    面试官:"小陈,说一下你常用的SQL优化方式吧." 陈小哈:"那很多啊,比如不要用SELECT *,查询效率低.巴拉巴拉..." 面试官:"为什么不要 ...

  2. EntityFramework Core 2.0执行原始查询如何防止SQL注入?

    前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...

  3. Mysql优化,导致查询不走索引的原因总结

    原文地址:http://blog.csdn.net/m0_37808356/article/details/72526687 最近公司让我做SQL优化的工作(MySql),用explain发了一些问题 ...

  4. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...

    前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...

  5. mysql 性能查看_MySQL查询性能问题排查

    Mysql数据库的性能问题排查是十分复杂的,具体方法视场景而定,这里只做大致思路分析. 1. 整体考虑导致查询性能低下的各种因素 导致SQL查询变慢的原因是多元化的,在遇到问题时首先要有一个全方位的思 ...

  6. 优化 es 中 should 加 matchPhraseQuery 查询性能

    先说下优化的背景 我们后端的所有接口有一个质量属性的要求,就是保证我们的接口响应时长不能超过 1s, 而这个根据用户名称查询用户昵称是很多其他接口的依赖,首先这个查询的过程,没法做缓存,因为客户那边需 ...

  7. EntityFramework Core查询数据基本本质

    [导读]在EntityFramework Core中.当查询出数据后,是如何将数据映射给实体的呢?本节我们预先做个基本探讨,后续给出其底层原理本质 前不久,我们在探索性能时,给出利用反射达到性能瓶颈时 ...

  8. EntityFramework Core 3.x添加查询提示(NOLOCK)

    前几天看到有博客园中有园友写了一篇关于添加NOLOCK查询提示的博文,这里呢,我将介绍另外一种添加查询提示的方法,此方式源于我看过源码后的实现,孰好孰歹,请自行判之,接下来我们一起来看看. 在Enti ...

  9. EntityFramework Core并发导致显式插入主键问题

    .NET Core 1.1单元测试问题 我们循序渐进,首先从单元测试开始说起,可能其中就有你在.NET Core上进行单元测试会遇到的问题,别着急,不妨一看.我们需要创建.NET Core类库,,如下 ...

最新文章

  1. 通过构建DCA(Decision Curve Analysis)模型、获取模型数据并使用python进行绘图
  2. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
  3. 玖富(NASDAQ:JFU) :2019年Q4机构资金占比增至79.8%,科技赋能业务成果显著
  4. Web前端主要学什么?这些知识要掌握
  5. 一、HTML和CSS基础--HTML+CSS基础课程--第1部分
  6. 大数据(11) - kafka的安装与使用
  7. 大量更新后数据膨胀_段合并的原理探寻
  8. Java里的稀疏矩阵Sparse Array
  9. 通过阅读 Douglas Crockford 的源码学习如何写 JSON parser(一)
  10. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)
  11. linux的三大服务器,Linux三大重要事件
  12. ubuntu下go插件delve下载安装
  13. 360全景拼接 opencv_360度视频序列全景图拼接系统的设计与实现
  14. html5页面的dtd定义是,DTD的作用
  15. 经纬度的多种格式和转换方式
  16. Ubuntu系统安装webrtc
  17. 什么是反射、反射可以做些什么
  18. 常德职院美和易思校企共建专业第一届PPT制作与演讲大赛圆满落幕
  19. 2d有限元计算机仿真,超导感应电机的建模与分析
  20. iOS 中生成随机数的4种方法(rand、random、arc4random、arc4random_uniform)

热门文章

  1. 解决VS2010 beta2 安装后html标签和script智能提示不起作用的问题
  2. 计算机英语课程背景,专家讲座第十五讲:信息化背景下高质量大学英语课程建设与教学设计...
  3. 运维前线:一线运维专家的运维方法、技巧与实践导读
  4. Monkey测试实例
  5. 稍微成型点的用WEBSOCKET实现的实时日志LOG输出
  6. jmeter(2)录制脚本
  7. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...
  8. Android STL PORT
  9. 第二十五章补充内容 5 不能为0的变量
  10. LAMP攻略: LAMP环境搭建,Linux下Apache,MySQL,PHP安装与配置