LINQ表达式无法翻译

时间:2020-05-11 14:55:22

标签: c# linq

我有以下数据库查询,我试图在其中检查是否存在链接到特定邮袋的带有特定条形码的商品。查询如下:

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。

2 个答案:

答案 0 :(得分:2)

设法通过将查询更改为以下内容来使其工作:

var exists = dbcontext.Items
                .AnyAsync(t => t.Barcode.Equals(barcode) &&
                            t.MailBagItems.Any(t => t.MailBag.Number.ToLower().Equals(mailbagNumber.ToLower())));

似乎以前不喜欢.FirstOrDefault()。MailBag。

答案 1 :(得分:1)

您的AnyAsync对于EF来说很难转换为SQL,如果您仍要使用该查询,则必须首先实现实体,如下所示:

var exists = dbcontext.Items
                .Include(t => t.MailBagItems)
                .ThenInclude(mt => mt.MailBag)
                .ToListAsync()
                .AnyAsync(t => t.Barcode.Equals(barcode) &&
                t.MailBagItems.FirstOrDefault() != null && 
t.MailBagItems.FirstOrDefault().MailBag.Number.ToLower().Equals(mailbagNumber.ToLower()));

您还错过了await关键字,还是想要这么做?