如何在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
相关产品推荐
相关产品推荐

