【发布时间】:2020-05-11 14:55:22
【问题描述】:
我有以下数据库查询,我试图检查是否存在带有特定条形码的项目,该条形码链接到特定的邮袋。查询如下:
var exists = await dbcontext.Items
.Include(t => t.MailBagItems)
.ThenInclude(mt => mt.MailBag)
.AnyAsync(t => t.Barcode.Equals(barcode) &&
t.MailBagItems.FirstOrDefault() != null &&
t.MailBagItems.FirstOrDefault().MailBag.Number.ToLower().Equals(mailbagNumber.ToLower()));
由于某种原因,我收到以下异常:
System.InvalidOperationException:无法使用 LINQ 表达式 翻译。要么以可以翻译的形式重写查询, 或通过插入调用显式切换到客户端评估 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。
通过删除部分布尔表达式,我知道问题出在我检查邮袋编号的最后一个布尔条件中。但是,如果我删除对 ToLower() 的调用,我会得到同样的错误。有人可以指出我的表达有什么问题以及如何解决吗?请注意,我使用的是 .NET core 3 和 SQL Server。
【问题讨论】:
-
如果您使用的是 Sql Server,那么您可能不需要 ToLower 调用,因为字符串的比较不区分大小写,除非您有区分大小写的排序规则。我不知道 EF 是否翻译 ToLower。我也不确定 Equals,但您可能想尝试 == 代替
-
试试
string.Equals(t.MailBagItems.FirstOrDefault().MailBag.Number,mailBagNumber,StringComparison.InvariantCultureIgnoreCase) -
不幸的是,我已经尝试了您的所有建议,但错误仍然相同。
-
你的查询有很多误解,试试这个,让我知道结果来详细描述它:
var lowerNumber = mailbagNumber.ToLower(); var exists = await dbcontext.Items .AnyAsync(t => t.Barcode == barcode && t.MailBagItems.First().MailBag.Number.ToLower() == lowerNumber));