LINQ查询在Dot Net Core 2.2中运行良好,但在3.1中运行良好

LINQ查询在Dot Net Core 2.2中运行良好,但在3.1中运行良好,linq,asp.net-core-3.1,entity-framework-core-3.1,Linq,Asp.net Core 3.1,Entity Framework Core 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("|")

下面的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();
}
[HttpGet({SINo}”)]
公共异步任务历史记录(字符串)
{
退货等待(从销售中的s)
其中s.saleInvNo.包含(“|”)
?s.saleInvNo.Split(“|”,StringSplitOptions.None)[1]==SINo
:s.saleInvNo==SINo
选择新的
{
s、 销售日期,
s、 萨利因弗诺
}).ToListAsync();
}
无法翻译。或者将查询重写为可以 通过插入 对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或 ToListAsync()

如何更改此可翻译查询


注:销售表有约100万条记录。除此之外,我只想得到一条记录。

string.Split
在LINQ to实体中不受支持。因此,您需要同时使用
Substring
IndexOf
,如下所示

使用:

而不是:

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

顺便说一下,你应该考虑<强> @ DavidG >强>建议:


再看看这个查询,我强烈建议您将这些数据标准化 要将“SINNo”值拆分为自己的列,没有什么大不了的 查询这种类型数据的方法


当它在EF Core 2.2中工作时,它会给您一个警告,告诉您该查询将在客户端而不是在您的数据库中进行评估。同时查看该查询,我强烈建议您将该数据正常化,以拆分“SINNo”将值放入自己的列中-没有很好的方法来查询这种类型的数据。假设
saleInvNo
有两个基于
|
的部分,那么如果尝试
s.saleInvNo.Substring(s.saleInvNo.IndexOf(“|”)+1)=SINo
而不是
s.saleInvNo.Split(“|”,StringSplitOptions.None)[1]==SINo
?@SelimYıldız有时它可能只有一个部分。这也没关系,因为您已经检查了
s.saleInvNo.Contains(“|”)
。你试过我的建议了吗?虽然这会奏效,但还是有问题。这将生成一个非“可搜索”的查询。这意味着数据库将使用索引扫描,甚至是表扫描。解决此问题并拥有performant数据库的唯一方法是拥有一个包含您正在搜索的值的列。@DavidG您是对的,同意。正如您在注释部分中提到的,如果
将此数据标准化,将“SINNo”值拆分为它自己的列,效果会更好。我已经更新了我的答案,加入了你的建议。谢谢你的贡献。
s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo