C# 不带or的Linq多where子句

C# 不带or的Linq多where子句,c#,linq,c#-4.0,entity-framework-6,C#,Linq,C# 4.0,Entity Framework 6,我正在尝试在linq中执行一个类似以下内容的multiple 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); 当我吐出SQL时,它看起来是

我正在尝试在linq中执行一个类似以下内容的multiple 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);
当我吐出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 ) ) ) 
注意

[Extent1].[Division] = @p__linq__0) OR (([Extent1].[Division] IS NULL)
我不希望它包括,或者我只希望它是

where Division = @p_Linq_0 and [Extent1].[ProductID] = @p_Linq_1 

我做错了什么?

除非您比较的值为空,否则就可以了。请注意括号:

(
 ([Extent1].[Division] = @p__linq__0) OR
 (([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
基本上,这是为了确保空值在C#中进行比较,如果
x
y
都是空引用,则
x==y
将计算为true。在SQL中,这不会计算为true,因为null值不被认为是相等的

LINQ旨在模拟您编写的C#代码,这就是为什么它会像这样检查空性。。。但是,如果传入的值不是null,那么它将不匹配任何具有null
除法的值

正如Evk所说,如果您使用的是实体框架,那么您可以在配置中使用该属性来避免这种情况:

获取或设置一个值,该值指示在比较两个可能为空的操作数时是否显示数据库null语义。默认值为false。例如,如果UseDatabaseNullSemantics为true,则(操作数1==操作数2)将分别转换为:(操作数1=操作数2),如果UseDatabaseNullSemantics为false,则分别转换为((操作数1=操作数2)和((操作数1为NULL或操作数2为NULL))或((操作数1为NULL)和(操作数2为NULL))


除非比较的值为空,否则就可以了。请注意括号:

(
 ([Extent1].[Division] = @p__linq__0) OR
 (([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
基本上,这是为了确保空值在C#中进行比较,如果
x
y
都是空引用,则
x==y
将计算为true。在SQL中,这不会计算为true,因为null值不被认为是相等的

LINQ旨在模拟您编写的C#代码,这就是为什么它会像这样检查空性。。。但是,如果传入的值不是null,那么它将不匹配任何具有null
除法的值

正如Evk所说,如果您使用的是实体框架,那么您可以在配置中使用该属性来避免这种情况:

获取或设置一个值,该值指示在比较两个可能为空的操作数时是否显示数据库null语义。默认值为false。例如,如果UseDatabaseNullSemantics为true,则(操作数1==操作数2)将分别转换为:(操作数1=操作数2),如果UseDatabaseNullSemantics为false,则分别转换为((操作数1=操作数2)和((操作数1为NULL或操作数2为NULL))或((操作数1为NULL)和(操作数2为NULL))


尝试将所有条件合并到一个where子句中,并使用&&运算符链接。第三个和第四个,
item.supplierNumber==item.supplierNumber
可能是错误的。请尝试将context.Configuration.UseDatabaseNullSemantics设置为true.FYI,最后两个子句将始终为
true
或抛出
NullReferenceException
您没有做错任何事情,LINQ生成处理所有可能情况的表达式,并且由于LINQ/C#当前默认为任何可能为
null
的对象,并且
null
=
null
在SQL中为false,但在C#中为true,因此它必须添加额外的测试来处理该情况。也许当C#具有非空性时,他们可以改进LINQ,使其不进行测试,从而让用户感到困惑。正如@RufusL所说,同样
item.OpcoID==item.OpcoID
将非常正确。请尝试将所有条件合并到一个where子句中,并用&&运算符链接。第三个和第四个,
item.supplierNumber==item.supplierNumber
可能是错误的。请尝试将context.Configuration.UseDatabaseNullSemantics设置为true.FYI,最后两个子句将始终为
true
或抛出
NullReferenceException
您没有做错任何事情,LINQ生成处理所有可能情况的表达式,并且由于LINQ/C#当前默认为任何可能为
null
的对象,并且
null
=
null
在SQL中为false,但在C#中为true,因此它必须添加额外的测试来处理该情况。也许当C#具有非空性时,他们可以改进LINQ,使其不进行测试,从而让用户感到困惑。正如@RufusL所说,同样
item.OpcoID==item.OpcoID
将是微不足道的事实。