【发布时间】:2020-03-26 14:34:13
【问题描述】:
我正在从 .Net 2.1 迁移到 3.1,其中包括 EF Core 升级。
现在我有如下的 LINQ 查询,没有问题:
var application = await _db.CustomerApplications
.AsNoTracking()
.Include(i => i.CustomerApplicationFields)
.Include(i => i.Customer)
.Where(x => x.Customer.PublicId == formId && x.IsPublished) // Also tried with &
.OrderByDescending(o => o.Version)
.FirstOrDefaultAsync();
使用 EF Core 3.1 时出现错误:
The LINQ expression 'DbSet<CustomerApplication>
.Where(c => !(c.Deleted))
.Join(
outer: DbSet<Customer>
.Where(c0 => !(c0.Deleted)),
inner: c => EF.Property<Nullable<long>>(c, "CustomerId"),
outerKeySelector: c0 => EF.Property<Nullable<long>>(c0, "Id"),
innerKeySelector: (o, i) => new TransparentIdentifier<CustomerApplication, Customer>(
Outer = o,
Inner = i
))
.Where(c => c.Inner.PublicId == __formId_0 && c.Outer.IsPublished)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
当我将此查询转换为以下内容时,它可以工作(将bool 评估移到外面):
var application = await _db.CustomerApplications
.AsNoTracking()
.Include(i => i.CustomerApplicationFields)
.Include(i => i.Customer)
.Where(x => x.Customer.PublicId == formId)
.OrderByDescending(o => o.Version)
.ToListAsync();
var result = application.FirstOrDefault(x => x.IsPublished);
有人可以向我解释一下,为什么这是一个问题?我也试过x.IsPublished == true,没有效果。这似乎很随机。
我也试过AsTracking()。
【问题讨论】:
-
你试过用 && 代替 & 吗?
-
我都试过了
-
什么是
IsPublished?这是一个存储的属性还是计算出来的东西(例如IsPublished => PublishDate > DateTime.UtcNow)? -
计算为是
[NotMapped] public bool IsPublished => PublishDate.HasValue;。如果我直接使用PublishDate.HasValue,它就可以工作......有解决方法还是我需要使用直接评估? -
EF Core 3.0 发行说明中直接提到了这个问题。你为什么不读它们?
标签: c# .net-core entity-framework-core-3.1