当前位置: 首页 > article >正文

如果用上以下几种.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调优的方法,欢迎留言讨论或者吐槽本文。


http://www.kler.cn/a/16848.html

相关文章:

  • 封装el-menu
  • 虚拟机安装Ubuntu 24.04服务器版(命令行版)
  • WebRTC API分析
  • flink sql + kafka + mysql 如何构建实时数仓
  • Kafka - 启用安全通信和认证机制_SSL + SASL
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • bash的进程与欢迎讯息自定义
  • C++命名空间的定义以及使用
  • C++煞笔笔记
  • 功能齐全的 DIY ESP32 智能手表设计之原理图讲解一
  • python实战应用讲解-【numpy数组篇】实用小技巧(九)(附python示例代码)
  • 这一篇LiveData掉不掉价(使用+粘性事件解决)
  • 07 Kubernetes 网络与服务管理
  • 项目沟通管理和干系人管理
  • 如何学习数据结构和算法
  • 《智能手机心率和呼吸率测量算法的前瞻性验证》阅读笔记
  • 23年5月高项备考学习笔记 —— 信息系统治理
  • NLP实战:基于Pytorch的文本分类入门实战
  • PS磨皮插件portraiture最新版磨皮工具
  • 【Python习题集3】常用数据结构习题
  • vcruntime140_1.dll丢失的解决方法
  • 3个经典线程同步问题
  • 用ChatGPT通过WebSocket开发一个交互性的五子棋微信小程序(二)
  • ArduPilot之开源代码基础知识Threading概念
  • Vue3通透教程【十四】TS复杂类型详解(一)
  • MATLAB函数封装2:QT调用封装函数