【问题标题】:EF generates a unwanted SQL for nullable entityEF 为可为空的实体生成不需要的 SQL
【发布时间】:2020-12-07 09:34:34
【问题描述】:

我有一个实体使用另一个可以为空的实体

class Parent 
{
   int? ChildId;
   Child Child;
}
class Child
{
   decimal Property;
}

我正在尝试对子属性进行过滤,但它会生成一个奇怪的 SQL

Parents.Select(p => new { X = p.Child.Property <> 0 ? 1 : 0  })

但是当我查看它生成的 SQL 时:

(([p.Child].[Property] <> 0.0) OR [p.Child].[Property] IS NULL).

我想要的SQL是有

(([p.Child].[Property] <> 0.0) OR [p.Child].[Property] IS NOT NULL)

不使用p.Child != null &amp;&amp; p.Child.Property &lt;&gt; 0 是否可以实现这一点。我试过了,但它仍然添加了 IS NULL 条件。

【问题讨论】:

  • EF6 还是 EF Core?如果是 Core,什么版本?
  • EF 核心版本 2.2

标签: sql-server entity-framework entity-framework-core ef-core-2.2


【解决方案1】:

这似乎是由已在 EF Core 3 中修复的 EF Core 2 中的错误/缺陷引起的,因为它不会在那里发生。

我可能已经尝试了所有可能的语法技巧,并且不管UseRelationalNulls 选项如何,它都会继续插入OR IS NULL 条件。

最后我得到了想要的

[p].[ChildId1] IS NOT NULL AND ([p.Child].[Property] <> 0.0

使用超反直觉的表达方式进行翻译

p.Child != null && !(p.Child.Property == 0)

(如你所说,自然的写法

p.Child != null && p.Child.Property != 0

仍然包含OR IS NULL条件,虽然它对结果没有影响)

【讨论】:

  • 感谢您对此进行调查。并确认在 EF 3 中不会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2021-03-03
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多