You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:35:41