首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Entity Framework Core 中优化查询:实现.NET 中的高性能数据访问

在 Entity Framework Core 中优化查询:实现.NET 中的高性能数据访问

作者头像
郑子铭
发布2024-12-23 13:48:25
发布2024-12-23 13:48:25
1K00
代码可运行
举报
运行总次数:0
代码可运行

在现代 Web 应用程序中,数据访问在性能方面起着至关重要的作用。Entity Framework Core (EF Core) 是适用于 .NET 的常用 ORM(对象关系映射器),可简化数据库交互。但是,如果不有效使用,可能会导致性能瓶颈。在本文中,我们将探讨在 EF Core 中优化查询的关键策略,以确保应用程序平稳运行。

为什么查询优化很重要

在深入研究优化技术之前,必须了解为什么优化查询至关重要。低效的查询可能会导致:

  • 响应时间慢:长时间运行的查询可能会延迟响应,从而影响用户体验。
  • 资源消耗增加:低效的查询会消耗更多的 CPU、内存和 I/O 资源。
  • 数据库争用:优化不佳的查询可能会导致争用,从而导致数据库锁定并进一步降低性能。

优化 EF Core 查询的关键策略

  1. 将 AsNoTracking 用于只读查询

默认情况下,EF Core 会跟踪从数据库中检索到的实体,这在内存和 CPU 方面可能会很昂贵。如果您不需要更新这些实体,请使用 来禁用更改跟踪。AsNoTracking()

代码语言:javascript
代码运行次数:0
运行
复制
var customers= context.Customers.AsNoTracking().ToList();

这个简单的更改可以显著提高只读查询的性能。

2. 利用已编译的查询 EF Core 允许您编译查询,这些查询可以多次重复使用,而无需重新转换。编译的查询对于频繁执行的查询特别有用。

代码语言:javascript
代码运行次数:0
运行
复制
var getCustomers= EF.CompileQuery((MyDbContext ctx)=>
ctx.Customers.Where(c=> c.IsActive));
var activeCustomers=getCustomers(context).ToList();

编译查询可以减少将 LINQ 表达式转换为 SQL 的开销,从而加快执行速度。

3. 尽早 筛选数据始终尽早筛选数据,以最大程度地减少从数据库中检索的数据量。这减少了数据库和应用程序的负载。

代码语言:javascript
代码运行次数:0
运行
复制
var customers= context.Customers.Where(c=> c.IsActive)
.Select(c=>new{ c.Name, c.Email}).ToList();

在此示例中,仅检索具有姓名和电子邮件的活动客户,从而减少加载的数据量和内存占用。

4. 使用投影以避免加载不必要的数据

EF Core 允许您仅投影所需的字段,这可以减小结果集的大小。

代码语言:javascript
代码运行次数:0
运行
复制
var customerNames= context.Customers.Where(c=> c.IsActive)
.Select(c=> c.Name).ToList();

此查询不会加载整个实体,而是仅检索客户名称,这可以显著减少传输的数据量。

5. 使用 Indexes 和 Include 语句 进行优化确保您的查询有效地利用索引。此外,用于在单个查询而不是多个查询中加载相关数据。Include()

代码语言:javascript
代码运行次数:0
运行
复制
var orders= context.Orders.Include(o=> o.Customer)
.Where(o=> o.OrderDate>= DateTime.Today).ToList();

此方法在单个查询中检索订单及其关联的客户,从而减少数据库往返的次数。

6. 批量操作 执行批量操作时,请考虑使用批处理来减少数据库往返次数。

代码语言:javascript
代码运行次数:0
运行
复制
var customers=context.Customers.Where(c=> c.IsActive).ToList();
foreach(var customerin customers){
customer.LastUpdated= DateTime.Now;}
context.SaveChanges();

此示例在单个批处理中更新多个客户,从而减少单个保存操作的开销。

实际示例:实际查询优化

让我们考虑一个真实场景,我们需要检索过去 30 天内下订单的活跃客户列表。我们将应用上面讨论的优化技术。

代码语言:javascript
代码运行次数:0
运行
复制
var activeCustomersWithRecentOrders= context.Customers
.AsNoTracking()
.Include(c=> c.Orders)
.Where(c=> c.IsActive&& c.Orders.Any(o=> o.OrderDate>= DateTime.Now.AddDays(-)))
.Select(c=>new
{
 c.Name,
 c.Email,
 RecentOrders= c.Orders.Where(o=> o.OrderDate>= DateTime.Now.AddDays(-))
})
.ToList();

在此优化的查询中:

  • 我们过去常常禁用更改跟踪,因为我们没有更新实体。AsNoTracking()
  • 我们仅包含过去 30 天的订单,以最大限度地减少数据检索。
  • 我们将数据投影到仅包含必要字段的形状中。

优化 EF Core 中的查询对于构建高性能 .NET 应用程序至关重要。通过使用禁用更改跟踪、编译查询、提前筛选数据和利用投影等技术,您可以显著提高应用程序的性能。请记住,优化的关键是了解应用程序的特定需求,并将这些策略应用于影响最大的地方。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么查询优化很重要
  • 优化 EF Core 查询的关键策略
  • 实际示例:实际查询优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档