用上这几种.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();
//欢迎公众号:DOTNET开发跳槽

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调优的方法,欢迎留言讨论或者吐槽本文。

来源公众号:DotNet开发跳槽

原文链接:https://www.cnblogs.com/xbhp/p/17292411.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用上这几种.NET EF Core性能调优,查询性能飙升 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Powershell小技巧之查看安装的.Net framework版本信息

    下面是“Powershell小技巧之查看安装的.Net framework版本信息”的完整攻略: 步骤1:打开Powershell 首先,打开Powershell终端。可以通过在开始菜单中键入“powershell”并点击“Windows Powershell”来打开终端。 步骤2:输入命令 在Powershell终端中输入以下命令: Get-ChildIt…

    C# 2023年6月3日
    00
  • 由ASP.NET Core读取Response.Body引发的思考

    前言     前几天有群友在群里问如何在我之前的文章《ASP.NET Core WebApi返回结果统一包装实践》的时候有点疑问,主要的疑问点就是关于Respouse的读取的问题。在之前的文章《深入探究ASP.NET Core读取Request.Body的正确方式》曾分析过关于Request的读取问题,需要读取Response的场景同样经常遇到,比如读取输出…

    C# 2023年4月18日
    00
  • .Net Core日志记录之日志配置

    .NET Core日志记录之日志配置 在.NET Core中,日志记录是一项非常重要的任务,它可以帮助您更好地了解应用程序的运行情况。在本攻略中,我们将详细讲解.NET Core日志记录之日志配置,并提供两个示例说明。 步骤一:添加日志记录提供程序 在.NET Core中,您需要添加日志记录提供程序,以便记录应用程序的日志。以下是添加日志记录提供程序的示例:…

    C# 2023年5月17日
    00
  • .aspx中的命名空间设置实现代码

    在ASP.NET Web应用程序中,代码文件(.aspx和.asax)的最顶部通常会引入命名空间,以便在这些页面中使用.NET框架中的类。 在.aspx页面中,我们可以使用<%@ Page %>指令指定页面的属性,其中包含要使用的命名空间。具体步骤如下: 打开你想要更新的.aspx文件。 在Page指令中添加<%@ Import %>…

    C# 2023年5月31日
    00
  • 在.NET中扫描局域网服务的实现方法

    下面是关于“在.NET中扫描局域网服务的实现方法”的完整攻略,包含两个示例。 1. 局域网服务扫描简介 在局域网中,我们可能需要扫描网络中的服务,以便找到可用的服务。在.NET中,我们可以使用Socket类和UDP协议来实现局域网服务扫描。以下是.NET中局域网服务扫描的详细介绍。 2. 局域网服务扫描全攻略 以下是使用.NET中Socket类和UDP协议实…

    C# 2023年5月15日
    00
  • C# GetHashcode():返回当前实例的哈希代码

    首先,C#中的GetHashCode()方法是一个用于获取对象哈希码的函数,用于将对象的状态转换为一串数字,以便在哈希表等数据结构中进行高效查找。它返回一个int类型的哈希值,可以作为该对象在哈希表中的索引值。 GetHashCode()的实现方式可能因为不同的开发者或.NET Framework版本而有所不同,但常见的默认实现是通过将对象中的字段或属性(称…

    C# 2023年4月19日
    00
  • c#数据绑定之删除datatable数据示例

    c#数据绑定之删除datatable数据示例 当我们使用c#编写程序时,有时需要对DataTable进行删除某些数据的操作,并且我们也需要确保在删除数据后页面及时刷新,使删除操作得到体现。下面,我们将详细讲解如何在c#中进行数据绑定和删除操作的完整攻略。 数据绑定操作 首先,在c#中进行数据绑定操作需要实现将数据源(如DataTable)绑定到控件,这样就可…

    C# 2023年6月1日
    00
  • C#启动和停止windows服务的实例代码

    启动和停止Windows服务是C#编程中的常见问题。本文将介绍如何使用C#编写代码来启动和停止Windows服务的实例代码。 步骤一:导入命名空间 要使用C#调用Windows服务,首先需要导入以下两个命名空间: using System.ServiceProcess; using System.Diagnostics; 步骤二:获取服务实例 可以通过以下方…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部