有没有办法通过EF Core更新多个记录,将单个属性设置为不同记录中的不同值,而不需要首先从数据库中检索所有记录?

我有两个实体:

public class EmployeeDepartment
{
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public int? ManagerId { get; set; }
    public int? DepartmentId { get; set; }
    public bool IsCurrent { get; set; }

    // Other fields omitted for clarity
}

public class EmployeeManagerCompact
{
    public int EmployeeId { get; set; }
    public int? ManagerId { get; set; }
}

我想从EmployeeManagerCompact条记录中更新EmployeeDepartment条记录中的ManagerId个字段.

在SQL Server T-SQL中,我会按以下方式使用UPDATE FROM:

update EmployeeDepartment
set ManagerId = upd.ManagerId
from EmployeeDepartment tgt
join EmployeeManagerCompact upd on tgt.EmployeeId = upd.EmployeeId
where tgt.IsCurrent = 1;

有没有可能在EF Core中执行类似的操作,而无需首先从数据库中检索所有EmployeeDepartment条记录?

推荐答案

EF Core 7+now supports ExecuteUpdateExecuteDelete,可以进行联合更新和删除.

var query = (
    from ed in context.EmployeeDepartment
    join tgt in EmployeeManagerCompact on ed.EmployeeId = tgt.EmployeeId
    where tgt.IsCurrent
    select new { ed, tgt }
);

await query.ExecuteUpdateAsync(setters => setters
    .SetProperty(tuple => tuple.ed.ManagerId, tuple => tuple.tgt.ManagerId)
);

.net相关问答推荐

使用EFCore.BulkExtensions库方法BulkInertOrUpdate时区分插入和更新的记录

NonSerialized 属性

不同命名空间中的部分类

每第 N 个字符/数字拆分一个字符串/数字?

如何使用c#从excel文件中读取数据

什么是编组?当某些东西被编组时会发生什么?

如何对无法加载的 VSTO 插件进行故障排除?

覆盖方法上的 C# 可选参数

Dapper 是否支持 SQL 2008 表值参数?

等效于 C# 在 powershell 中的使用关键字?

覆盖 ASP.NET MVC 中的授权属性

何时何地使用 GetType() 或 typeof()?

String.Join 与 StringBuilder:哪个更快?

什么是 .NET 应用程序域?

为什么甚至可以更改私有成员,或使用反射在 C# 中运行私有方法?

如何向 C# Winforms 中的标签添加提示或工具提示?

从字节数组中读取 C# 中的 C/C++ 数据 struct

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

有没有一种简单的方法来判断 .NET Framework 版本?

如何为 Dapper 查询动态创建参数