首页 > 解决方案 > LINQ 查询在 Dot Net Core 2.2 但在 3.1 中工作正常

问题描述

下面的 LINQ 查询按预期工作,Dot Net Core 2.2但是当我升级到3.1它时会引发运行时执行。

[HttpGet("{SINo}")]
public async Task<IEnumerable<dynamic>> SaleHistory(string SINo)
{
    return await (from s in _context.Sales
                  where s.saleInvNo.Contains("|")
                        ? s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo
                        : s.saleInvNo == SINo
                  select new
                  {
                      s.saleDate,
                      s.saleInvNo
                  }).ToListAsync();
}

无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估

如何更改此可翻译查询?

注意:销售表有约 100 万条记录。从中,我只想获得一张唱片。

标签: linqasp.net-core-3.1entity-framework-core-3.1

解决方案


string.Split在 LINQ to Entities 中不受支持。这样您就需要按照以下方式一起使用Substring和。IndexOf

采用:

s.saleInvNo.Substring(s.saleInvNo.IndexOf("|") + 1) == SINo

代替:

s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo

请参阅:拆分嵌套在实体框架中

顺便说一句,您应该考虑@DavidG的建议:

还要查看此查询,我强烈建议您规范化此数据以将“SINNo”值拆分为自己的列 - 没有很好的方法来查询这种类型的数据


推荐阅读