首页
学习
活动
专区
圈层
工具
发布

从30秒到30毫秒:EF Core查询性能优化实战全记录

本文将挑战如何优化一个真实场景中的EF Core慢查询。EF Core提供了强大的工具,但使用不当会导致查询缓慢。 我将一步步展示如何将EF Core查询从难以接受的30秒优化到惊人的30毫秒。....Include(u => u.Comments) .ThenInclude(c => c.Post) .ThenInclude....Include(u => u.Comments) .ThenInclude(c => c.Post) .ThenInclude...优化6:拆分查询(AsSplitQuery) 当投影深层对象图时,EF Core常生成包含多个JOIN的大型SQL,导致数据重复和性能下降。...本次EF Core查询优化挑战中,我们将查询从30秒优化到约30毫秒。关键收获: 1. 数据筛选(优化1-3):只加载必要数据 2. 两阶段投影(优化4,7,8):将大工作拆分为小查询 3.

32610

EF Core 性能陷阱:10个悄然扼杀应用速度的隐形杀手及破解之道

尽管它拥有优雅的 API 和开发者友好的方法,但如果使用不当,EF Core 也可能成为性能瓶颈。...N+1 查询问题:无声的性能杀手 N+1 问题可以说是 EF Core 中最常见的性能陷阱。...它发生在你获取一个实体集合,然后为每个实体访问其关联属性时,这会导致 EF Core 执行一次查询获取初始集合,再为每个关联实体执行 N 次额外的查询。...不好:包含所有内容 var user = await context.Users .Include(u => u.Posts) // 加载 Posts .ThenInclude(...客户端评估:当 EF Core 放弃治疗时 EF Core 有时无法将复杂的 LINQ 表达式转换为 SQL,于是退而求其次进行客户端评估(Client-Side Evaluation),将所有数据拉入内存进行处理

38410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    01-EF Core笔记之创建模型

    使用EF Core的第一步是创建数据模型,模型建的好,下班走的早。EF Core本身已经设置了一系列约定来帮我们快速的创建模型,例如表名、主键字段等,毕竟约定大于配置嘛。...如果你想改变默认值,很简单,EF Core提供了Fluent API或Data Annotations两种方式允许我们定制数据模型。...):基类和子类不在同一个表中,子类中包含基类的所有字段,目前EF Core不支持该模式 EF Core仅支持TPH模式,基类和子类数据将存储在同一个表中。...这里只是为了演示,真实场景中,EF Core已经提供了枚举到字符串的转换器,我们只需要直接使用即可。...EF Core支持实体具有有参的构造函数,默认情况下,EF Core使用无参构造函数来实例化实体对象,如果发现实体类型具有有参的构造函数,则优先使用有参的构造函数。

    3.8K20

    张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

    《张高兴的 Entity Framework Core 即学即用》系列博客共分为 4 个部分: 第一部分将从 0 开始创建一个 EF Core 应用,介绍了使用 Database First 的方式以及手工的方式生成实体类...张高兴 2022年3月22日 ---- 本文将使用 .NET 6 创建一个控制台程序,从 0 开始,学习 EF Core 的使用。...创建一个 EF Core 应用 项目地址:https://github.com/ZhangGaoxing/ef-core-demo 项目结构 创建一个控制台应用和类库,项目结构如下: Pandemic...之后打开数据库上下文 PandemicContext.cs,会发现其中还是有些许的问题,比如创建时间字段 created_dt 的默认值为 PostgreSQL 中的 now() 函数,但 EF 并没有将其识别出来...手动创建实体类 下面将手动编写两个实体类 Hospital.cs 和 Doctor.cs,以熟悉 EF Core Attribute 是如何将数据库表和实体类之间建立联系的。

    3.1K10

    手把手教你用.NET修仙:三天炼化EFCore

    实体间的关系纽带 外键:CultivatorId自动关联修士表 ️三、迁移大法(Migration) # 安装EFCore神通 dotnet tool install --global dotnet-ef...# 创建初始迁移(相当于绘制藏宝图) dotnet ef migrations add InitialCreate # 应用迁移(开辟洞天福地) dotnet ef database update...经过七日苦修,已掌握EFCore基础心法: ✅ 创建DbContext灵根 ✅ 定义实体模型 ✅ 运用迁移大法 ✅ 熟练CRUD操作 ✅ 理解关系映射 进阶预告: LINQ高阶查询(相当于神识扫描)...A: 检查实体定义是否合理,删除旧迁移重新尝试 Q: Include和ThenInclude有什么区别?...A: Include加载直接关联实体,ThenInclude加载嵌套关联实体 修真箴言: "代码如修行,EFCore似心法,唯有勤加练习,方能证得大道!" 点击关注,获取更多.NET修真秘籍!

    19010

    炼器真解:EFCore的修炼之路

    今天我们要将修仙界的炼器之道与现代软件开发中的ORM框架相结合,为大家带来一篇别开生面的技术文章~ EF Core作为.NET世界中最强大的ORM框架之一,就像修仙界的炼器宝典,能助你将数据库操作化繁为简...;Database=修仙数据库;Trusted_Connection=True;"); } 施展迁移法术: dotnet ef migrations add 初始创建 dotnet ef database...Core最佳实践 ⚡异步修行:尽量使用ToListAsync等异步方法,避免阻塞修炼线程 器灵节制:贪婪加载(Include)要适度,避免一次性加载太多关联数据 追踪消耗:只读操作可使用AsNoTracking...و ̑̑,相信各位道友已经掌握了EF Core的两大法门(DbFirst/CodeFirst)和器灵觉醒(导航属性)的精髓~ 记住,ORM框架如同炼器,既要掌握基本法诀,也要理解其内在灵性。...如果有任何EF Core问题,也可以提出来,我们一起探讨解法! ▌转载请注明出处,渡人渡己 感谢道友结缘!

    24710

    Entity Framework Core 2.0 入门

    该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle...EF Core迁移: 简单的来说就是 Model变化 --> 创建migration文件 --> 应用Migration到数据库或生成执行脚本....EF.Functions.Like 这个方法是新方法, 就像是Sql语句里面的Like一样, 或者字符串的Contains方法: 这个感觉更像Sql语句, 输出到Console的Sql语句如下: 这里还要谈的是...SQL语句不可以包含关联的导航属性, 但是可以配合Include使用以达到该效果(https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#including-related-data...(FromSql也可以Include). 预加载子表的子表: 可以使用ThenInclude方法, 这个可以老版本ef没有的.

    3.8K80

    Entity Framework Core 2.0 入门

    该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle...EF Core迁移: 简单的来说就是 Model变化 --> 创建migration文件 --> 应用Migration到数据库或生成执行脚本....EF.Functions.Like 这个方法是新方法, 就像是Sql语句里面的Like一样, 或者字符串的Contains方法: 这个感觉更像Sql语句, 输出到Console的Sql语句如下: 这里还要谈的是...SQL语句不可以包含关联的导航属性, 但是可以配合Include使用以达到该效果(https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#including-related-data...(FromSql也可以Include). 预加载子表的子表: 可以使用ThenInclude方法, 这个可以老版本ef没有的.

    4.2K140

    Entity Framework Core 2.0 新特性

    (在本例中为用户定义的函数),但在方法注册期间可以覆盖名称和模式 目前只支持标量功能 必须自行在数据库中创建映射函数,EF Core迁移不会对其进行创建 2.性能提升方面 2.1DbContext连接池...在ASP.NET Core程序中我们使用EF Core一般都是将自定义DbContext类型注册到依赖注入系统中,然后通过控制器中的构造函数参数获取该类型的实例。...虽然EF Core通常可以根据查询表达式的散列表示自动编译和缓存查询,但这种机制可以通过绕过哈希计算和高速缓存查找来获得小的性能增益,从而允许应用程序使用已经通过调用委托编译了查询。...() 添加了EF.Functions属性(注意,这里应该是可以扩展的,添加更多的数据库方法),EF Core可以使用它们来定义映射到数据库函数或操作符的方法,以便可以在LINQ查询中调用它们。...这样一个方法的第一个例子是Like(): var aCustomers = from c in context.Customers where EF.Functions.Like(c.Name

    5K90

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

    EF.Functions.Like()(#2850) - 允许将通配符的字符串匹配转换为SQL或在内存中进行匹配。...然后,此过滤器将适用于所有查询,包括贪婪加载(即Include())。 上下文池(#6923) - 通过使DbContext实例可以重用而不是始终从头开始创建,从而提高性能。(重要!!!重要!!!...生命周期挂钩(#626) - 包括创建实体(ObjectMaterialized从EF6.x),数据库命令拦截,连接打开时运行附加命令的事件。...原来考虑加入,但是至今没有加入计划的任务: 基于ODBC的提供程序(#7432) - 这将允许为具有ODBC提供程序的数据库(但可能没有特定于数据库的ADO.NET提供程序)创建一个EF Core提供程序...,是不是有种拨开云雾见太阳的感觉.. 2.EF.Functions.Like()(#2850) - 这个目前是只加入了like,后期还要加入更多的数据库函数.大大增强了代码可读性和效率

    3.8K90

    .NET 性能—Entity Framework Core调优

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

    70941

    WPF 运行时迁移 EF Core 数据库

    在客户端开发,可以使用 .NET Core 3.0 开发 WPF 程序,可以使用 EF Core 连接数据库。...客户端的数据库使用 SQLite 在不同的版本需要在客户端运行做数据库迁移升级数据库 在 WPF 使用 EF Core 可以安装下面的库 Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson...dotnet ef migrations add Lindexi 执行上面代码可以看到在项目里面添加了 Migrations 文件夹,这个文件夹里面包含数据库的迁移代码 在主函数可以使用下面代码创建数据库...migrations add 版本名 此时建议创建迁移代码,在软件运行的时候执行 Migrate 函数将会自动升级数据库 如果数据库是需要升级的,那么请使用 Database.Migrate 函数创建数据库...那么可能是在调用 Migrate 等方法之前没有先调用 dotnet ef migrations 创建迁移类

    83310

    一步步学习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其实也一样,....首先我们需要创建一个EF日志类,继承Microsoft.Extensions.Logging.ILogger 如下: private class EFLogger : ILogger {

    1.6K90
    领券