C# 将.netcore 2.2升级到.NET 5后出现LINQ错误

C# 将.netcore 2.2升级到.NET 5后出现LINQ错误,c#,linq,.net-core,entity-framework-core,.net-5,C#,Linq,.net Core,Entity Framework Core,.net 5,从.netCore 2.2升级到.NET 5后,我收到以下错误: 无法翻译LINQ表达式“e”。要么重写 以可翻译的形式进行查询,或切换到客户端评估 通过插入对“AsEnumerable”、“ASASASyncEnumerable”的调用,显式地, “ToList”或“ToListSync”。看见 了解更多信息 这是我的密码: var查询= (来自ctx.CotacoesFornecedores.IgnoreQueryFilters().AsNoTracking()中的cf) 在cf.Forne

从.netCore 2.2升级到.NET 5后,我收到以下错误:

无法翻译LINQ表达式“e”。要么重写 以可翻译的形式进行查询,或切换到客户端评估 通过插入对“AsEnumerable”、“ASASASyncEnumerable”的调用,显式地, “ToList”或“ToListSync”。看见 了解更多信息

这是我的密码:

var查询=
(来自ctx.CotacoesFornecedores.IgnoreQueryFilters().AsNoTracking()中的cf)
在cf.Fornecedores=f.Id上的ctx.Fornecedores.IgnoreQueryFilters().AsNoTracking()中加入f
在f.ParceRoid上的ctx.PessoasJuridicas.IgnoreQueryFilters().AsNoTracking()中加入pj等于pj.ParceRoid
在cf.cotacoid=c.Id上的ctx.Cotacoes.IgnoreQueryFilters().AsNoTracking()中加入c
其中filtero.Fornecedores.包含(cf.FornecedorId)
&&c.EmpresaId==idEmpresa
&&c.状态==Models.statuscotaco.Liberada.Id
&&codigoStatus.Contains(参见Status)
&&(!apenasVigentes | |(apenasVigentes&c.DATAINICAL=dataAtual))
订货人c.数字,c.数据单位
选择新的
{
c、 身份证,
IDCOTACOOFORNECEDOR=参考Id,
pj.Cnpj,
pj.NomeFantasia,
pj.RazaoSocial,
c、 头号人物,
c、 数据金融,
c、 最终数据,
参见状态,
参见FornecedorId,
参见PermiteAlterarQuantidadeEmbalagem,
c、 观察家
});
如果(filtro.Id>0)
query=query.Where(q=>q.Id==filtro.Id);
如果(filtro.Numero>0)
query=query.Where(q=>q.Numero==filtro.Numero);
if(filtro.datainical.GetValueOrDefault()>DateTime.MinValue)
query=query.Where(q=>q.datainical.Date>=filtro.datainical.Value.Date);
if(filtro.DataFinal.GetValueOrDefault()>DateTime.MinValue)
query=query.Where(q=>q.DataFinal.Value.datenewmodels.cotacofornecedor
{
Id=q.Id,
数字=q.数字,
IdFornecedor=q.FornecedorId,
IDCOTACOFORNECEDOR=q.IDCOTACOFORNECEDOR,
CnpjFornecedor=q.Cnpj,
NomeFantasiaFornecedor=q.NomeFantasia,
RazaoSocialFornecedor=q.RazaoSocial,
datainical=q.datainical,
DataFinal=q.DataFinal,
Status=Models.statuscotacofornecedor.List().SingleOrDefault(e=>e.Id==q.Status),
PermiteAlterQuantidaDeembalagem=q.PermiteAlterQuantidaDeembalagem,
观察者=q.观察者
}).ToPagedList(filtro);
错误指向Status=Models.statuscotacofornector.List().SingleOrDefault(e=>e.Id==q.Status)的结尾,


我知道客户端评估已经不可能了,但我不知道在不破坏代码逻辑的情况下如何使其工作的最佳解决方案,有什么建议吗?

将客户端逻辑与服务器端逻辑分开。很难推断您的查询需要自动进行后处理

var页面列表=
.选择(q=>new Models.cotacofornecedor
{
Id=q.Id,
数字=q.数字,
IdFornecedor=q.FornecedorId,
IDCOTACOFORNECEDOR=q.IDCOTACOFORNECEDOR,
CnpjFornecedor=q.Cnpj,
NomeFantasiaFornecedor=q.NomeFantasia,
RazaoSocialFornecedor=q.RazaoSocial,
datainical=q.datainical,
DataFinal=q.DataFinal,
PermiteAlterQuantidaDeembalagem=q.PermiteAlterQuantidaDeembalagem,
观察者=q.观察者
}).ToPagedList(filtro);
foreach(页面列表中的变量q)
{
q、 Status=Models.statuscotacofornector.List().SingleOrDefault(e=>e.Id==q.Status);
}
返回页面列表;

添加.AsEnumberable解决了我的问题。

通过在相应位置调用
AsEnumberable
可以进行客户端评估。
ToPagedList
做了什么?请注意
.IgnoreQueryFilters()。AsNoTracking()
每个查询只需要一次。将它们添加到末尾。注释掉
Status=Models.statuscotacoforcedor.List()。SingleOrDefault(e=>e.Id==q.Status),
看起来是个问题。请阅读错误消息。它并没有说您不能使用客户端评估。这是一个坏主意——这意味着如果他把记录放在错误所在的行上,它可能会急切地提取记录。在它之前已经有无数的过滤器。这只意味着它将返回(潜在的)不必要的colums,然后他将映射到模型。并不是说他会选择entier数据库表。这不会解决问题,而是将来的问题。