【发布时间】:2020-04-20 23:04:10
【问题描述】:
我像这样更改了 LINQ 表达式。
public async Task<IEnumerable<Thing>> Get(bool all)
{
List<Thing> output = await Context.Things
//.Where(_ => all || _.DeletedOn == null && _.Deletedon < DateTime.Now)
.Where(_ => all || _.Active)
.ToListAsync();
return output;
}
显然,它导致了以下错误。
InvalidOperationException:无法翻译 LINQ 表达式“DbSet .Where(l => False || l.Active)”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。
好吧,我确实调用了 AsListAsync(),但我有点困惑,因为 .NET Core EF 无法解释如此简单的条件。我怀疑我可能遗漏了其他东西。
类Thing看起来像这样。
class Thing
{
...
public DateTime? DeletedOn { get; set; }
public Active => DeletedOn == null && DeletedOn < DateTime.Now.
}
检查provided link 什么也没给我。
【问题讨论】:
-
你有一个逻辑问题,因为条件 Active => DeletedOn == null && DeletedOn
-
@lior 正确。但这是异常的原因吗?!
-
这句话是什么意思。
Where(_ => all -
EF 在使用计算属性时有限制,因为很难找到它们背后的“坐”。它基本上尝试将属性名称(即 Active)映射到数据库列,这会失败并导致错误。简而言之,我认为您必须坚持第一个选项。
-
怎么能比现在既空又少呢?至于您的错误消息,linq 无法翻译您的 bool Active 属性,因为它不是表达式。
标签: c# .net-core .net-core-3.0