C# 为什么EF核心生成反向位比较

C# 为什么EF核心生成反向位比较,c#,sql-server,.net-core,entity-framework-core,.net-5,C#,Sql Server,.net Core,Entity Framework Core,.net 5,我们正在尝试将我们的项目升级到.net core 5。现在我们正与一种奇怪的EF行为作斗争。 一个简单的查询: context.Set().Where(o=>o.Archived==false) 如果Order.Archived在数据库中不为空,则会生成这样一个查询: 从存档的强制转换顺序中选择*(1位) 为什么会发生这种情况?我们希望有如下查询: 从存档的顺序中选择*=CAST(0作为位) 这种反转可能会阻止数据库在更复杂的查询中使用适当的索引。 有没有办法让EF生成更直接的查询 注:我

我们正在尝试将我们的项目升级到.net core 5。现在我们正与一种奇怪的EF行为作斗争。 一个简单的查询:

context.Set().Where(o=>o.Archived==false)
如果Order.Archived在数据库中不为空,则会生成这样一个查询:

从存档的强制转换顺序中选择*(1位)
为什么会发生这种情况?我们希望有如下查询:

从存档的顺序中选择*=CAST(0作为位)

这种反转可能会阻止数据库在更复杂的查询中使用适当的索引。 有没有办法让EF生成更直接的查询


注:我们也尝试过同样的方法处理可为空的字段。在那里,我们确实收到了预期的查询。

我对此进行了研究,对于可为空的属性,它工作得很好,正如预期的那样。 对于不可为null的属性,我发现了这个技巧,它给出了预期的结果

context.Set<Order>().Where(o => new []{false}.Contains(o.Archived))

“这样的反转可能会阻止在更复杂的查询中使用正确的索引”-那么,这个特定的转换现在真的有问题吗?那么,在github中创建问题。
o=>!o、 存档
收益率?如果由于
Archived
可为空(即使它在数据库中不可为空)而无法工作,则您的模型可能需要调整。@Jeroenmoster Archived在模型和数据库中也不可为空。o=>!o、 存档会产生同样奇怪的查询。@AakashM是的,this.OMG有问题,很好的解决方法;)
select * from Order where Archived = CAST(0 as bit)