【发布时间】:2020-04-11 13:33:37
【问题描述】:
我刚刚升级到 EF 3,我的一个查询曾经可以工作,现在却给出了异常
ProductionRecords = _context.ProductionRecords
.Where(r => r.DataCriacao.Date == DateTime.Now.Date)
.Select(pr => new ProductionRecordViewModel
{
Id = pr.Id,
Operador = pr.Operador,
DataCriacao = pr.DataCriacao,
Celula = pr.Celula.Name,
Turno = pr.Turno.Name,
TotalPecasSemDefeito = pr.ReferenceRecords.Sum(c => c.Quantity),
TotalPecasComDefeito = pr.DefectRecords.Sum(c => c.Quantidade),
TotalTempoParado = pr.StopRecords.Sum(c => Convert.ToInt32(c.Duration.TotalMinutes)),
})
.AsNoTracking()
.ToList();
当我尝试将集合与时间跨度和持续时间相加时会发生异常......
我现在该怎么处理?
这里是例外
InvalidOperationException:LINQ 表达式 '(EntityShaperExpression:EntityType:StopRecord ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ).Duration.TotalMinutes' 无法翻译。要么重写查询的形式,可以 被翻译,或通过插入显式切换到客户端评估 调用 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。见https://go.microsoft.com/fwlink/?linkid=2101038 更多信息。
【问题讨论】:
-
您能否更新问题以包含例外情况
-
任何 .net 方法或类都不能转换为查询。您的 convert.toint() 和 Duration.totalminutes 可能是您的问题。如果您仍然想要这些,请在您的选择之前添加 .tolist()。
-
TotalTempoParado = pr.StopRecords pr.StopRecords.Sum(c => Convert.ToInt32(c.Duration.TotalMinutes))是错字吗? -
您应该将此问题发布到 EF Core GitHub 以了解他们处理此类问题的愿景。显然,按照建议切换到客户端评估是不可能的,并且添加急切/延迟加载会使其效率非常低。
-
@ivanstoev 客户端评估是可能的,如果您调用 asnotracking,然后列出,然后过滤这些结果。