我们正试图将项目升级到.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.:我们也尝试了对可空字段使用相同的方法。在那里,我们确实收到了预期的查询。
o => !o.Archived
会产生什么结果?如果这不起作用,因为Archived
是可空的(即使在数据库中它不是可空的),那么您的模型可能需要调整。 - Jeroen Mostert