LINQ查询在Dot Net Core 2.2中运行良好,但在3.1中运行良好
下面的LINQ查询在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("|")
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