C# .NET EFCore 性能优化

查询缓存优化

利用EF Core的查询缓存机制,相同的查询语句会被缓存,避免重复编译。对于频繁执行的查询,可以显式启用缓存:

csharp 复制代码
var compiledQuery = EF.CompileQuery(
    (DbContext context, int id) => 
        context.Products.FirstOrDefault(p => p.Id == id));

批量操作处理

使用AddRange或RemoveRange替代单条操作,结合SaveChanges的批处理能力:

csharp 复制代码
context.Products.AddRange(productList);
context.SaveChanges();

启用批处理需要配置SQL Server提供程序:

csharp 复制代码
optionsBuilder.UseSqlServer(connectionString, 
    o => o.MaxBatchSize(100));

延迟加载慎用

导航属性的延迟加载会导致N+1查询问题。显式加载或预加载更高效:

csharp 复制代码
var orders = context.Orders
    .Include(o => o.OrderDetails)
    .ToList();

异步操作提升吞吐量

使用async/await避免线程阻塞:

csharp 复制代码
var product = await context.Products
    .FirstOrDefaultAsync(p => p.Id == id);

跟踪行为控制

只读查询禁用变更跟踪:

csharp 复制代码
var products = context.Products
    .AsNoTracking()
    .Where(p => p.Price > 100)
    .ToList();

索引优化

确保查询字段有数据库索引:

csharp 复制代码
modelBuilder.Entity<Product>()
    .HasIndex(p => p.CategoryId);

SQL日志监控

开发阶段开启日志检查生成SQL:

csharp 复制代码
optionsBuilder.UseLoggerFactory(loggerFactory)
    .EnableSensitiveDataLogging();

分页查询优化

使用Skip/Take时确保有序:

csharp 复制代码
var pagedData = context.Products
    .OrderBy(p => p.Id)
    .Skip(20)
    .Take(10)
    .ToList();

原始SQL复杂查询

高性能场景直接执行SQL:

csharp 复制代码
var products = context.Products
    .FromSqlRaw("SELECT * FROM Products WITH (NOLOCK)")
    .ToList();

连接池配置

调整DbContext池大小避免资源争用:

csharp 复制代码
services.AddDbContextPool<AppDbContext>(options => 
    options.UseSqlServer(connectionString), poolSize: 128);
相关推荐
UWA1 天前
告别「好像还行」:制作人别再靠感觉做线上质量决策|GPM 小Q MCP 实战
性能优化·游戏开发·gpm
贾伟康1 天前
【共创稿事节】WaterFlow瀑布流的列宽策略
性能优化·实战·harmonyos·arkts·arkui
Leinwin1 天前
Copilot Studio 实战:多模型选择、GitHub Copilot harness 计费与 Copilot Credits 额度管理
开发语言·c#
FuckPatience1 天前
C# Winform 使用Label循环显示闪烁
开发语言·c#
念何架构之路1 天前
OpenTelemetry核心概念
后端·目标跟踪·golang·c#·linq
开开心心就好1 天前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
波力海苔夹心脆6751 天前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
CSharp精选营1 天前
制造业 ERP 物料建模:主料、辅料和 BOM 到底怎么拆才稳
.net·erp·bom·制造业·物料建模
何以解忧唯有撸码1 天前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp