c# - 为什么 EF Core 会生成反转位比较

标签 c# sql-server .net-core entity-framework-core .net-5

我们正在尝试将我们的项目升级到 .net core 5。现在我们正在努力解决一个奇怪的 EF 行为。
一个简单的查询:

context.Set<Order>().Where(o => o.Archived == false)
其中 Order.Archived 在数据库中为 bit NOT NULL,生成这样的查询:
select * from Order where Archived <> CAST(1 as bit)
为什么会发生这种情况?我们希望有如下查询:
select * from Order where Archived = CAST(0 as bit)
这种反转可能会阻止数据库在更复杂的查询中使用正确的索引。
有没有办法让 EF 生成更直接的查询?
P.S.:我们也对可空字段尝试了相同的方法。在那里我们确实收到了预期的查询。

最佳答案

我调查了这一点,对于可为空的属性,它运行良好,正如预期的那样。
对于不可为空的属性,我发现了这个技巧,它给出了预期的结果

context.Set<Order>().Where(o => new []{false}.Contains(o.Archived))
在这种情况下,我们会收到以下 sql 查询:
select * from Order where Archived = CAST(0 as bit)

关于c# - 为什么 EF Core 会生成反转位比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66688479/

相关文章:

c# - 悬停后如何更改按钮的颜色并单击xaml

c# - 在 IIS 7 中托管 Asp.Net Core

SQL Server查询选择列表中的无效列

asp.net - 在 HTML 表中显示 SqlDataSource 数据(DataTables 插件)

.net-core - 尽管没有进行任何更改,但为什么 EF Core 在每次迁移时都会更新种子 bool 字段?

.net-core - .net core 中发布和调试构建配置的设置在哪里

c# - HttpClient 使用自签名证书调用 HTTPS WebApi

c# - C#中的ગુજરાતી语言

sql - 将行复制并粘贴到具有不同值的同一 SQL 表中

c# - 如何确定可移植类库中的当前代码页?