EF Core中如何使用带连接的LINQ查询更新数据并返回受影响行数
EF Core实现多表关联更新并获取影响行数
针对你提供的SQL更新语句,以下是两种EF Core的实现方式,都能获取更新操作影响的行数:
一、EF Core 7+ 批量更新(推荐,性能更优)
EF Core 7及以上版本支持ExecuteUpdate/ExecuteUpdateAsync方法,无需加载实体到内存,直接生成对应SQL执行批量更新,返回受影响行数:
// 执行批量更新并获取影响行数 int affectedRows = await context.BranchItemVariants .Where(biv => biv.BusinessBranchID == 5 && biv.ItemVariant.Item.ItemCategories.Any(ic => ic.CategoryID == 11)) .ExecuteUpdateAsync(setters => setters.SetProperty(biv => biv.IsActive, false)); // 输出结果 Console.WriteLine($"更新影响了 {affectedRows} 行");
说明
- 利用实体类的导航属性(
biv.ItemVariant.Item、Item.ItemCategories)实现原SQL中的多表关联逻辑 ExecuteUpdateAsync会直接生成与原SQL逻辑一致的数据库更新语句,性能远优于先查询再更新的方式
二、EF Core 6及以下版本:查询后更新
如果使用较低版本的EF Core,需要先查询出符合条件的实体,修改属性后再保存更改:
// 查询符合条件的BranchItemVariants实体 var targetItems = await context.BranchItemVariants .Include(biv => biv.ItemVariant) .ThenInclude(iv => iv.Item) .ThenInclude(i => i.ItemCategories) .Where(biv => biv.BusinessBranchID == 5 && biv.ItemVariant.Item.ItemCategories.Any(ic => ic.CategoryID == 11)) .ToListAsync(); // 批量修改属性 foreach (var item in targetItems) { item.IsActive = false; } // 保存更改并获取影响行数 int affectedRows = await context.SaveChangesAsync(); Console.WriteLine($"更新影响了 {affectedRows} 行");
注意事项
- 确保你的DbContext中已正确配置实体间的导航属性,否则无法通过LINQ实现多表关联
- 这种方式需要将实体加载到内存,数据量较大时性能会受影响
内容的提问来源于stack exchange,提问作者Faizan Naeem
相关产品推荐
相关产品推荐

