gpt4 book ai didi

c# - EntityFramework Core 3 linq表达式无法翻译

转载 作者:行者123 更新时间:2023-12-03 15:35:42 37 4
gpt4 key购买 nike

我刚刚升级到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();

当我尝试将集合与时间和持续时间相加时,会发生异常。

我现在应该如何处理?

这是个异常(exception)

InvalidOperationException: The LINQ expression '(EntityShaperExpression: EntityType: StopRecord ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ).Duration.TotalMinutes' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

最佳答案

EF3中有一个重大更改,除非在查询链的最末端(您的Convert.ToInt32(c.Duration.TotalMinutes)可能依赖于此),否则EF3不会自动恢复为客户端评估。

尝试像这样重写查询:

 ProductionRecords = _context.ProductionRecords
.Where(r => r.DataCriacao.Date == DateTime.Now.Date)
.AsNoTracking()
.AsEnumerable()
.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 pr.StopRecords.Sum(c => Convert.ToInt32(c.Duration.TotalMinutes)),
})
.ToList();

UPD 注释中已正确指出-这基本上会将 .Select评估推迟到客户端。这可能会导致性能问题。这种行为很可能是首先对EF Core 3进行了此更改的原因。

我没有足够的细节向您推荐适当的解决方案,但似乎您真的无法摆脱在所有结果上加载 StopRecords的麻烦。这是编写自定义方法转换器可以为您提供帮助的地方。请参阅我的 other answer有关如何执行此操作的信息。我迅速检查了EF Core 3的来源,看来 IMethodCallTranslator仍然存在。这意味着您很有可能构建一个自定义函数,该函数将在SQL中将日期转换为TotalMinutes。

关于c# - EntityFramework Core 3 linq表达式无法翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59401492/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com