Linq多个where子句没有或

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)

我究竟做错了什么 ?

Jon*_*eet 5

除非您比较的值为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,如果xy是空引用.在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.