如果用上以下几种.NET EF Core性能调优,那么查询的性能会飙升

这篇具有很好参考价值的文章主要介绍了如果用上以下几种.NET EF Core性能调优,那么查询的性能会飙升。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、避免在循环中进行查询操作:

避免在循环中进行查询操作,可以将查询结果缓存到内存中,然后对内存中的数据进行操作,可以提高性能。这种方式适合集合数据量少的数据,否则利大于弊。

// 不建议的方式:在循环中进行查询操作
foreach (var item in itemList)
{
    var result = context.Items.FirstOrDefault(i => i.Id == item.Id);
//执行逻辑
}
// 推荐的方式:将查询结果缓存到内存中,然后对内存中的数据进行操作
var itemIds = itemList.Select(i => i.Id).ToList();
var results = context.Items.Where(i => itemIds.Contains(i.Id)).ToList();
foreach (var item in itemList)
{
    var result = results.FirstOrDefault(r => r.Id == item.Id);
    //执行逻辑
}

 

2、避免使用懒加载:

避免使用懒加载,因为每次访问导航属性都会触发额外的数据库查询。使用显式加载或预先加载的技术可以提高性能。

// 不建议的方式:使用懒加载
var order = context.Orders.FirstOrDefault();
foreach (var item in order.Items)
{
  //执行逻辑
}
// 推荐的方式:使用预先加载
var order = context.Orders.Include(o => o.Items).FirstOrDefault();
foreach (var item in order.Items)
{
   //执行逻辑
}

 

3、合理使用Include方法:

Include方法可以在一次查询中获取所有相关的实体对象。但是,当涉及到大量数据时,Include方法会导致性能下降。可以使用手动链接查询代替Include方法。

// 不建议的方式:使用Include方法获取所有关联实体
var orders = context.Orders.Include(o => o.Items).ToList();

// 推荐的方式:使用手动链接查询代替Include方法
var orders = context.Orders
    .Join(context.OrderItems,
          o => o.Id,
          oi => oi.OrderId,
          (o, oi) => new { Order = o, OrderItem = oi })
    .ToList();

 

4、使用NoTracking方法:

使用NoTracking方法可以避免EF Core的跟踪功能。跟踪功能在更新和删除实体对象时非常有用,但是在只需要读取数据时,跟踪功能会导致额外的开销。使用NoTracking方法可以禁用跟踪功能,从而提高性能。

// 不建议的方式:使用默认跟踪功能
var order = context.Orders.FirstOrDefault();
// 推荐的方式:使用NoTracking方法
var order = context.Orders.AsNoTracking().FirstOrDefault();

 

5、执行原始SQL查询:

有些情况下,使用原始的SQL语句可以比使用EF Core更高效。使用FromSqlRaw或者ExecuteSqlRaw方法可以执行原始SQL查询。

// 执行原始SQL查询
var orders = context.Orders.FromSqlRaw("SELECT * FROM Orders WHERE Status = 'Complete'").ToList();

 

6、使用EF.CompileAsyncQuery

EF.CompileAsyncQuery是EF Core的一个扩展方法,它可以将LINQ表达式编译为一个异步查询。相比于动态生成LINQ查询,使用EF.CompileAsyncQuery可以提高查询性能,减少不必要的内存分配。

编译后的查询可以多次调用,而不必每次动态生成查询表达式。这样可以避免不必要的内存分配和查询优化开销,提高查询性能。在EF Core 5.0及以上版本中,EF.CompileAsyncQuery已经成为了标准的扩展方法,无需进行任何特殊的安装或配置即可使用。它适用于查询条件固定的情况,当然也可以重新编译,不过频繁的编译会造成内存和性能的开销。示例如下:

using Microsoft.EntityFrameworkCore.Query;
// 定义一个异步查询
private static readonly Func<MyDbContext, int, Task<Order>> GetOrderById =
    EF.CompileAsyncQuery((MyDbContext context, int id) =>
        context.Orders.FirstOrDefaultAsync(o => o.Id == id));
// 调用异步查询
var order = await GetOrderById(context, 1);

 

总结

以上讲述了6种性能调优的方式,希望对大家有所帮助,尤其是面试的时候,当面试官问您有没有什么办法提高EF Core的性能,大家可以回答其中几个。当然上面的方法不是绝对的,需要根据实际场景来应用,比如Include方法在数据量小的情况下适合使用,数据量大的话就适得其反了。大家还有什么EF Core调优的方法,欢迎留言讨论或者吐槽本文。文章来源地址https://www.toymoban.com/news/detail-431337.html

到了这里,关于如果用上以下几种.NET EF Core性能调优,那么查询的性能会飙升的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 试试这 6 个小技巧,提升 EF Core 性能

    试试这 6 个小技巧,提升 EF Core 性能

    Entity FrameWork(简称 EF)以面向对象的方式操作数据库给开发人员带来了很大的便利性,但其性能问题从面世以来就一直就被广大的 .NET 生态开发技术人员所吐槽,然而,它真的那么不堪使用吗?试试下面这 6 个小技巧,瞬间极大提升 EF Core 性能: AsNoTracking 在项目开发的时候

    2024年02月04日
    浏览(11)
  • NET8 ORM 使用AOT SqlSugar 和  EF Core

    NET8 ORM 使用AOT SqlSugar 和 EF Core

    .Net8的本地预编机器码NET AOT,它几乎进行了100%的自举。微软为了摆脱C++的钳制,做了很多努力。也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等。而需要C++做的,也就仅仅是引导程序,本篇通过代码来看下这段至关重要的引导程序的运作模式。      SqlSugar已经

    2024年02月05日
    浏览(27)
  • 当在IDEA中实现类实现接口时,如果出现红色错误并且无法引入接口类的包,可能是以下几种情况导致的

    当在IDEA中实现类实现接口时,如果出现红色错误并且无法引入接口类的包,可能是以下几种情况导致的

    1.当在IDEA中实现类实现接口时,如果出现红色错误并且无法引入接口类的包,可能是以下几种情况导致的: 2.缺少依赖:首先检查项目的依赖是否正确配置。如果接口类所在的包不在项目的依赖中,IDEA将无法找到该包并引入。可以通过在项目的构建工具(如Maven或Gradle)中添

    2024年02月17日
    浏览(11)
  • .net 6 EF Core MySql数据库表生成实体类命令

    安装下面这几个包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design Pomelo.EntityFrameworkCore.MySql Scaffold-DbContext “server=127.0.0.1;port=3306;database=DB;uid=root;pwd=pwdpwd;sslmode=none;” Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force -NoOnConfiguring -NoPluralize -Context “D

    2024年02月05日
    浏览(8)
  • .NET6.0 EF Core 之 DB First生成实体类

    .NET6.0 EF Core 之 DB First生成实体类

    EF Core可以使用DB First模式生成实体类具体步骤如下: 因为.NET Core中默认不包含EF Core的工具和程序包,需要通过NuGet管理器安装对应的工具和程序包,这里使用SQL Server数据库。 Microsoft.EntityFrameworkCore.SqlServer:SQL Server数据库EF提供程序 Microsoft.EntityFrameworkCore.Design:设计时使用到

    2024年02月06日
    浏览(14)
  • .net core 创建WebAPI以及使用EF DBFirst框架使用方法与疑问解答(.net 6)

    EF语法包: 生成实体模型: 修改实体模型: 把生成的实体和上下文都输出到某个文件夹命令 增加JSON格式脚手架: 若想增加某个版本json脚手架,需要加入后缀如: 问题与解决方案: 1、问题: Your startup project \\\'XXX\\\' doesn\\\'t reference Microsoft.EntityFrameworkCore.Design. This package is requi

    2024年02月16日
    浏览(14)
  • .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移

    .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移

    接上期文章《.NET6项目连接数据库方式方法》,有人问了我几个问题,现在就这几个问题,拓展延申一下创建实体类、数据库。把ORM框架和数据迁移都写进去。 我的项目是在Linux上创建的,使用的是vscode开发工具远程开发。为了方便大家阅读和操作,我将项目down到我的本地电

    2024年02月05日
    浏览(12)
  • .NET使用EF批量插入数据,一行代码性能飙升!

    背景 小编最近接到一个任务,批量获取内部网站用TXT生成的日志,在闲时把日志插入到MySql数据库做分析。为了快速开发小编选择了Entity Framework Core,很快开发完成了。测试数据不是很多,批量插入数据很快完成,效率很高。但是部署到线上问题来了,最开始也挺快,越到后

    2024年02月13日
    浏览(12)
  • .NET 6 “目标进程已退出,但未引发 CoreCLR 启动事件。请确保将目标进程配置为使用 .NET Core。如果目标进程未运行 .NET Core,则发生这种情况并不意外。”

    .NET 6 “目标进程已退出,但未引发 CoreCLR 启动事件。请确保将目标进程配置为使用 .NET Core。如果目标进程未运行 .NET Core,则发生这种情况并不意外。”

    Mac M1 在 .NET 6 上调试.NET 5 的Web应用程序出现程序闪退问题 首先看了下本地 .NET 的环境 本地只有 .NET 6 的SDK 和 runtimes 环境,.NET 6 对 .NET 5 是兼容的, 需要在 .csproj 文件中做如下配置: 如果不这样配置的话会报如下错误: 另外,如果是Windows的话,直接再装一套 .NET 5 也可以解

    2024年02月16日
    浏览(35)
  • .NET Core性能优化技巧

    .NET Core作为一个跨平台的开源框架,以其高效、灵活和可扩展的特性受到了广大开发者的青睐。但在实际开发中,如何确保应用程序的性能始终是一个关键的问题。本文将介绍十大.NET Core性能优化技巧,帮助开发者提升应用程序的性能。 1. 使用异步编程 .NET Core支持异步编程

    2024年02月19日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包