我想使用 @where 条件从数据库中获取所有记录,然后对它们进行更新。为此,我创建了以下查询:
public async Task MarkAllAsActive()
{
var currentUserId = _userManager.GetCurrentUserId();
await _workOrders.Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
{
row.Status = WorkOrderStatus.Active;
_uow.MarkAsChanged(row, currentUserId);
});
}
但是这个查询选择了数据库中的所有字段,这并不好。为了解决这个问题,我尝试仅选择特定的字段,比如ID
、Status
:
public async Task MarkAllAsActive()
{
var currentUserId = _userManager.GetCurrentUserId();
await _workOrders.Select(row=>new WorkOrder { Id=row.Id,Status=row.Status}).Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
{
row.Status = WorkOrderStatus.Active;
_uow.MarkAsChanged(row, currentUserId);
});
}
但是它返回了这个错误:
在LINQ to Entities查询中,实体或复杂类型'DataLayer.Context.WorkOrder'无法构造。
我看到了一个类似的帖子和相同的错误,但我的问题不同,因为我想要更新。
我该怎么做?
.Select(row=>new {Id =row.Id,Status=row.Status})
,linq to entities 允许使用匿名类型投影。在我看来,你应该先使用Where
,然后使用Select
选择所需的项目。 - M. Wiśnicki_uow.MarkAsChanged()
。我认为你正在尝试以错误的方式进行更新。 - M. WiśnickiUPDATE workorders SET Status = ? WHERE Status = ?;
查询。很遗憾,没有任何方法可以通过 Entity Framework 完成此操作,但如果您关心性能,则这是最佳方法。 - jorgonorToList
中,然后使用ForEach > SingleOrDefault
再次查询并保存。 - KiRa