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

如何在EF Core中实现单数据库往返的关联更新操作?

实现单次数据库往返的EF Core写法

要避免两次数据库往返,你可以直接在更新查询的条件中嵌套子查询,不用先查询用户的Number列表。EF Core会将其翻译成与你原SQL逻辑一致的单条UPDATE语句,仅需一次数据库请求:

await db.Revisions
    .Where(r => r.Type == Consts.TABLE_USER 
                && db.Users.Where(u => id.Contains(u.Id)).Select(u => u.Number).Contains(r.Number))
    .ExecuteUpdateAsync(
        update => update.SetProperty(r => r.Value, r => r.Value + 1),
        s.Token
    )
    .ConfigureAwait(false);

或者用Any写法,效果完全一致:

await db.Revisions
    .Where(r => r.Type == Consts.TABLE_USER 
                && db.Users.Any(u => id.Contains(u.Id) && u.Number == r.Number))
    .ExecuteUpdateAsync(
        update => update.SetProperty(r => r.Value, r => r.Value + 1),
        s.Token
    )
    .ConfigureAwait(false);

关键说明

  • 你原来的写法中,ToListAsync会先发起一次查询获取Number列表,之后的ExecuteUpdateAsync再发起第二次请求,导致两次数据库往返。
  • 上述两种写法都会让EF Core生成包含子查询的UPDATE语句,和你提供的原生SQL结构完全匹配,仅需一次数据库交互。
  • 无需添加AsNoTracking,因为ExecuteUpdateAsync本身不会加载实体到上下文,该配置在此场景下没有意义。

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:56:05