【问题标题】:EF update statement with select query and where cause combined带有 select 查询和 where 原因组合的 EF 更新语句
【发布时间】:2023-01-01 00:35:37
【问题描述】:
UPDATE [Revision] 
SET [Value] = [Value] + 1
WHERE [Type] = 0 
  AND [Number] IN (SELECT [Number] FROM [User] 
                   WHERE Id IN (5111, 5211, 5311))

如何在 EF Core 中编写此查询?

我试过:

var n = await db.Users
                .AsNoTracking()
                .Where(x => id.Contains(x.Id))
                .Select(y => y.Number)
                .ToListAsync(s.Token)
                .ConfigureAwait(false);

await db.Revisions
        .AsNoTracking() 
        .Where(y => y.Type == Consts.TABLE_USER && n.Contains(y.Number))
        .ExecuteUpdateAsync(z => 
                   z.SetProperty(o => o.Value, o => o.Value + 1),
                   s.Token
                 ).ConfigureAwait(false);

但作为两次往返,它的性能并不好。

我只想编写 EF Core 一次往返以获得高性能。

【问题讨论】:

  • 只需首先删除ToListAsync,无论如何,如果显示模型类,查询可以重写。

标签: sql-server entity-framework-core ef-core-7.0


【解决方案1】:

如何在 EF Core 中编写此查询?

不要获取用户。只需使用 Bulk Update and Bulk Delete 将其组合到更新查询中即可,例如:

//n should be a subquery expression, not a collection
var n = db.Users
          .Where(x => id.Contains(x.Id))
          .Select(y => y.Number);

await db.Revisions
        .Where(y => y.Type == Consts.TABLE_USER && n.Contains(y.Number))
        .ExecuteUpdateAsync(z => 
                   z.SetProperty(o => o.Value, o => o.Value + 1),
                   s.Token
                 );

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多