为什么EF Core会生成反向位比较

4
我们正试图将项目升级到.NET Core 5,但目前我们遇到了一个奇怪的 EF 行为。 一个简单的查询:
context.Set<Order>().Where(o => o.Archived == false)

在数据库中,Order.Archived 是非空的比特位。这将生成如下查询:

select * from Order where Archived <> CAST(1 as bit)

为什么会这样呢?我们期望的查询应该像下面这样:
select * from Order where Archived = CAST(0 as bit)

这种反向操作可能会阻止数据库在更复杂的查询中使用适当的索引。 有没有办法让 EF 生成一个更简单的查询?

P.S.:我们也尝试了对可空字段使用相同的方法。在那里,我们确实收到了预期的查询。


这种反转可能会防止在更复杂的查询中使用正确的索引...那么现在这个具体的翻译是否存在问题呢? - AakashM
1
在 GitHub 上创建问题。 - Svyatoslav Danyliv
o => !o.Archived 会产生什么结果?如果这不起作用,因为 Archived 是可空的(即使在数据库中它不是可空的),那么您的模型可能需要调整。 - Jeroen Mostert
@AakashM 是的,这个有问题。 - horgh
你打算告诉我们吗? - AakashM
显示剩余2条评论
1个回答

2

我研究了一下,对于可为空的属性,它可以正常工作,如预期的那样。 对于非空属性,我发现这个技巧可以得到预期的结果。

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

在这种情况下,我们收到以下的SQL查询:
select * from Order where Archived = CAST(0 as bit)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接