首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EF Core 3,优化大量Include/ThenInclude

基础概念

Entity Framework Core (EF Core) 是一个开源的、轻量级的、可扩展的、跨平台的对象关系映射(ORM)框架,用于.NET Core应用程序。IncludeThenInclude 方法用于在查询时加载关联的实体,以避免懒加载带来的性能问题。

相关优势

  1. 延迟加载:默认情况下,EF Core 支持延迟加载,即在访问关联实体时才从数据库加载数据。
  2. 预加载:通过 IncludeThenInclude 方法,可以在查询时预加载关联实体,减少数据库查询次数,提高性能。
  3. 导航属性:EF Core 支持导航属性,方便在实体之间进行关联查询。

类型

  • Include:用于加载一对一或一对多关系的关联实体。
  • ThenInclude:用于加载嵌套的多对多关系的关联实体。

应用场景

当需要查询主实体及其关联实体时,可以使用 IncludeThenInclude 方法。例如,查询一个订单及其所有订单项和每个订单项的产品信息。

问题及解决方法

问题:大量 Include/ThenInclude 导致性能问题

当查询涉及大量关联实体时,使用 IncludeThenInclude 可能会导致性能问题,因为每次 Include 都会增加一次数据库查询。

原因

  1. N+1 查询问题:即使使用了 Include,如果关联实体较多,仍然可能导致 N+1 查询问题。
  2. 内存消耗:加载大量数据会消耗大量内存,影响系统性能。

解决方法

  1. 分页查询:使用分页查询减少单次查询的数据量。
  2. 分页查询:使用分页查询减少单次查询的数据量。
  3. 投影查询:使用 Select 进行投影查询,只选择需要的字段,减少内存消耗。
  4. 投影查询:使用 Select 进行投影查询,只选择需要的字段,减少内存消耗。
  5. 批量加载:使用第三方库如 EFCore.BulkExtensions 进行批量加载,减少数据库查询次数。
  6. 批量加载:使用第三方库如 EFCore.BulkExtensions 进行批量加载,减少数据库查询次数。
  7. 异步查询:使用异步查询提高系统响应能力。
  8. 异步查询:使用异步查询提高系统响应能力。

参考链接

通过以上方法,可以有效优化大量 Include/ThenInclude 带来的性能问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一步步学习EF Core(3.EF Core2.0路线图)

年第2季度 2.0 2017年第3季度 2.1 2017年第4季度 值得注意的一点是,在ASP.NET Core的路线图中,全新的SignalR将在ASP.NET Core2.1版本发布 2.积压的内容...因为EF Core是一个新的代码库,所以在Entity Framework 6.x中存在一个功能并不意味着会在EF Core中实现。...仅供参考 3.关键的ORM功能 下面是微软开发团队认为需要的东西,微软爸爸觉得..嗯..EF Core是可以向所有人推荐的EF版本。...Xamarin在使用EF core还未完全测试. 5.EF Core 2.0(还开发中...)...然后,此过滤器将适用于所有查询,包括贪婪加载(即Include())。 上下文池(#6923) - 通过使DbContext实例可以重用而不是始终从头开始创建,从而提高性能。(重要!!!重要!!!

3.1K90
  • 5个EF core性能优化技巧,让你程序健步如飞

    Contains语句,生成的sql为: var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList()...(DateDiffHour、DateDiffMonth),求天、小时、月之间的数量 PS:在EF Core中StartsWith、Contains和EndsWith模糊查询实际分别被解析成为Left、...Z.EntityFramework.Plus.EFCore依赖使用一些特殊的语法 这个是免费的,但 Z.EntityFramework.Plus的一些批量数据操作的包是收费的 (1) EFCore删除必须先查询再删除,优化后可直接删除...:context.User.Where(t => t.Id == 100).Delete(); (2)优化更新语句:context.User.Where(t => t.Id == 4).Update(t...=>new User() { NickName = "2224114" ,Phone = "1234"} ); 3、正确使用Find(id=10)来代替FirstOrDefault(t=>t.id=10

    2.6K50

    .NETer们,你真的应该了解下EF Core3.x了!

    本期导读: 技术文,带你了解关于EntityFrameworkCore3.x的那些事,本文共1493个字,阅读大约需要3分钟。文末福利不要错过哦!...2 EFCore前世今生 2008年发布了EntityFramework第一个版本3.5,到2017年发布的6.2.0最新版本,累计发布了16个正式版本,常规O/RM框架能做的事儿,EF也已经做得非常优秀了...(3)便携数据库迁移 项目开发中,数据库结构的变更一般都是脚本支持,面对数据结构结构的的变更,数据的升级,只能编写复杂的Sql脚本;老师就有过惨痛的经历。...1 EFCore内置Api直接生成数据库,一次配置轻松生成 2 EFTool工具迁移数据库,生成迁移文件再生成数据库 3 dotNet命令迁移,生成迁移文件,生成数据库 ?

    1K10

    【愚公系列】2023年01月 .NETC#知识点-EF Core性能优化之显示编译

    文章目录 前言 1.显示编译的概念 一、Core性能优化之显示编译 1.安装 2.注入 3.创建数据库上下文类 4.创建查询控制器类 5.运行 5.1 常规查询 5.2 显示编译查询 ---- 前言...对于EF Core的查询优化其实也是多种多样的,性能优化是在特定的情况下的特定解决方案,下面着重介绍EF Core的显示编译查询 1.显示编译的概念 EF Core对我们查询的表达式的编译使用了缓存,当你查询代码需要重用以前执行的查询时...,EF Core将使用哈希查找并从缓存中返回已编译的查询。...说白了也就是跳过查找的过程,而且使用场景如下: EF Core,还不支持编译查询返回集合类型。 在数据量大的时候使用,比如查询大于一百万次时候大约回快6倍,一万次大约是2倍左右。...一、Core性能优化之显示编译 本文主要是内存数据库的方式来测试显示编译查询的性能,避免了其他因素。

    46930

    .NET 性能—Entity Framework Core调优

    按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面 缓存 异步 sql 本片文章,我们针对.NET Core Web项目的EF Core框架进行性能优化。...正文 1、EF Core框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访问的性能相比首次会提升一大截 2、尽可能的通过主键查询 3、在进行字符串模糊查询时,分为三种情况 //StartsWith...Core优化 那么如果是多个表的数据查询如何优化呢?...().ToList(); 原理 默认预先加载(懒加载)时,EF core为我们生成的sql语句为left join语句,查询结果为主表、副表的所有字段;右表数据的字段会存在null。...数据库查询进行笛卡尔积查询,实际查询了4次 拆分查询时,EF Core会生成两个sql语句: 1、单表查询主表product 2、主表product与副表productLogs进行inner join,

    35141

    .NET ORM核心功能之导航属性- EFCore和 SqlSugar

    SQL简直就是恶梦 (一对多和一对一也有提升,没有多对多明显) //EF CORE查询 var Persons= dbContext.Person //需要定义DbSet才能点出来 .Where(it=...(z1 => z1.Department) .Include(z1 => z1.Position) .Include(z1 => z1.Education) .Include(z1 => z1...Sql本身就不支持对多层级结构查询,所以不用ORM想实现高性能的多层级结构是需要花大量精力去优化和写代码的 //EF CORE查询 var Persons= dbContext.Person .Include...).ToList() EF Core导航属性配置 EF多对多 public class Student { public int StudentId { get; set; } public...原码下载: https://github.com/DotNetNext/SqlSugar 总结: .NET中无论是EF CORE还是SQLSUGAR 使用了导航属性都不再需要费心写繁琐的SQL语句,只需简单地调用导航属性

    53840

    我的 .NET Core 博客性能优化经验总结

    导语 去年8月,我用 .NET Core 重写了我的博客系统。经过一年多的优化,服务器响应速度从上线时候的 80ms 提高到了现在的 8ms,十倍提速。...性能优化需要针对不同系统,不同业务场景,不同应用领域,不同用户种群,没有一个通用方法。比如我的博客,是内容站,交互少,大量情况都是各种姿势读数据,所以我要保证的是尽可能快的提升数据读取速度。...我博客大部分的场景都是只读数据,并且读取后直接处理好关联数据(Include),因此可以使用AsNoTracking()来断开EF对于对象的追踪,节省内存也提高性能。...我在2012年还写过一篇关于性能的文章,至今也适用于.NET Core,欢迎参考: 《Performance tips for Entity Framework》 另外,在最新的EF Core 3.x中...,微软为了不被人骂EF性能差,直接默认禁止了client side evaluation,避免了忘写Include结果还开Lazy Load导致外键表被查询几百次的尴尬场面。

    3.4K10

    【ASP.NET Core 基础知识】--数据库连接--使用Entity Framework Core进行数据库访问

    更高的性能: EF Core 设计上更加高效,能够提供更好的性能,特别是在执行大量数据操作时。...迁移支持: 提供程序需要支持 EF Core 的数据迁移功能,允许开发人员在数据库模式更改时创建迁移。 性能优化: 提供程序通常会针对特定数据库引擎进行优化,以提高数据访问性能。...EF Core 的 ORM 特性使得数据库操作更加直观和易于管理,同时提供了强大的查询、关系映射和性能优化机制。...预加载相关实体:在查询时,通过使用Include或Explicit Loading来预加载相关实体,减少多次查询数据库的需要。...3. 接下来,你可以使用 DbContext 实例执行数据库操作。

    45900

    近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略

    这也是我经验不足,导致没能一下子定位解决;而我又对我们后台整个团队有着固执的自尊,不想通过大量水平扩容这种方式挺过压力高峰,导致线上连续几晚都出现了不同程度的问题,肯定对于我们的业务增长是有影响的。...这系列文章主要记录下我们针对这次业务增长,对于我们后台微服务系统做的通用技术优化,针对业务流程和缓存的优化由于只适用于我们的业务,这里就不再赘述了。...Log4j2 异步日志基于 Disruptor,其中的等待策略,本次优化前,我们选用的是 BLOCK。...主要原因是,业务量突增时,通常伴随着大量远大于 CPU 数量的线程进入 Runnable 状态,同时伴随着大量的 CPU 计算以及缓存行更新和失效,这会引起很大的总线流量,导致 Notify 信号被日志消费单线程感知受到影响的同时...甚至是 RUNNABLE 的线程个数都远大于 CPU 个数,使用基于 Wait 的 BusySpinWaitStrategy 会导致业务闲时突然来业务高峰的时候,日志消费线程唤醒的不够及时(CPU 一直被大量

    24210

    一步步学习EF Core(2.事务与日志)

    前言 上节我们留了一个问题,为什么EF Core中,我们加载班级,数据并不会出来 其实答案很简单,~ 因为在EF Core1.1.2 中我们在EF6.0+中用到的的延迟加载功能并没有被加入,不过在EF...我们也可以通过贪婪加载来获取,修改查询代码如下: public IActionResult ListView() { return View(_context.UserTable.Include...下面我们开始今天的内容 事务 关于EF Core的事务,其实与EF 6.x几乎一样,代码如下: using (var tran = _context.Database.BeginTransaction...下面我们来讲一下关于EF Core中的日志 日志 我们知道,在ASP.NET Core中,大量的使用了IOC的手法来注入我们所需要的类. EF Core其实也一样,....CreateLogger(string categoryName) { // NOTE: 这里要注意,这是 EF Core 1.1的使用方式,如果你用的 EF

    1.5K90
    领券