Mic*_*out 0 c# linq c#-4.0 entity-framework-6
我正在尝试在linq中执行多个where子句,如下所示:
.Where(x => x.Division == item.Division)
.Where( x => x.ProductID == item.ProductID)
.Where( x => item.supplierNumber == item.supplierNumber)
.Where(x => item.OpcoID == item.OpcoID);
Run Code Online (Sandbox Code Playgroud)
当我吐出SQL时,它看起来像这样
WHERE ( ( [extent1].[Division] = @p__linq__0 )
OR ( ( [extent1].[Division] IS NULL )
AND ( @p__linq__0 IS NULL ) ) )
AND ( ( [extent1].[ProductID] = @p__linq__1 )
OR ( ( [extent1].[ProductID] IS NULL )
AND ( @p__linq__1 IS NULL ) ) )
AND ( ( @p__linq__2 = @p__linq__3 )
OR ( ( @p__linq__2 IS NULL )
AND ( @p__linq__3 IS NULL ) ) )
AND ( ( @p__linq__4 = @p__linq__5 )
OR ( ( @p__linq__4 IS NULL )
AND ( @p__linq__5 IS NULL ) ) )
Run Code Online (Sandbox Code Playgroud)
注意到
[Extent1].[Division] = @p__linq__0) OR (([Extent1].[Division] IS NULL)
Run Code Online (Sandbox Code Playgroud)
我不希望它包括或我只是希望它
where Division = @p_Linq_0 and [Extent1].[ProductID] = @p_Linq_1
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
除非您比较的值为null,否则它会没问题.注意包围:
(
([Extent1].[Division] = @p__linq__0) OR
(([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
Run Code Online (Sandbox Code Playgroud)
基本上它的保证,因为它们是在C#空值进行比较,其中x == y将评估为TRUE,如果x和y是空引用.在SQL中,不会计算为true,因为空值不被视为相等.
LINQ旨在模拟您编写的C#代码,这就是为什么它会像这样检查null ...但是如果传入的值不为null,则它将不匹配任何具有null Division值的值.
正如Evk所说,如果您使用的是Entity Framework,则可以UseDatabaseNullSemantics在配置中使用该属性来避免这种情况:
获取或设置一个值,该值指示在比较两个操作数时是否显示数据库空语义,这两个操作数都可能为空.默认值为false.例如(operand1 == operand2)将被翻译为:(operand1 = operand2)如果UseDatabaseNullSemantics分别为true(((operand1 = operand2)AND(NOT(operand1 IS NULL或operand2 IS NULL)))OR((operand1 IS) NULL)AND(operand2 IS NULL)))如果UseDatabaseNullSemantics为false.