0 %

C# .NET EFCore 性能优化

2026-07-10 17:28:32

查询缓存优化

利用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()

.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(options =>

options.UseSqlServer(connectionString), poolSize: 128);

Posted in 比利时世界杯
Copyright © 2088 2034年世界杯_足球中国世界杯预选赛 - qdhuaxue.com All Rights Reserved.
友情链接