EF 为可为 null 的实体生成不需要的 SQL

EF generates a unwanted SQL for nullable entity

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

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 && p.Child.Property <> 0 可以实现吗?我试过了,但它仍然添加了 IS NULL 条件。

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

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

最后我得到了想要的

[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条件,虽然对结果没有影响)