【发布时间】:2020-08-20 02:29:56
【问题描述】:
在Dot Net Core 2.2 中,LINQ 查询按预期工作,但是当我升级到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()
如何更改此可翻译查询?
注意:Sales 表有大约 100 万条记录。从中,我只想得到一个记录。
【问题讨论】:
-
虽然它在 EF Core 2.2 中工作,但它会向您发出警告,告诉您此查询将在客户端而不是在您的数据库中进行评估。
-
另外查看此查询,我强烈建议您规范化此数据以将“SINNo”值拆分到自己的列中 - 没有很好的方法来查询这种类型的数据。
-
假设
saleInvNo有两个部分基于|那么如果你尝试s.saleInvNo.Substring(s.saleInvNo.IndexOf("|") + 1) == SINo而不是s.saleInvNo.Split("|", StringSplitOptions.None)[1] == SINo怎么样? -
@SelimYıldız 有时它可能只有 1 个部分。
-
没关系,它也应该适用,因为您已经检查过
s.saleInvNo.Contains("|")。你试过我的建议了吗?
标签: linq asp.net-core-3.1 entity-framework-core-3.1