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
条件,虽然对结果没有影响)
我有一个实体使用另一个可以为空的实体
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
条件,虽然对结果没有影响)