没有或的 Linq 多个 where 子句
Linq multiple where clause with no or
我正在尝试在 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);
当我吐出 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
我做错了什么?
除非你比较的值是null,否则没问题。注意括号:
(
([Extent1].[Division] = @p__linq__0) OR
(([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
基本上,它确保空值像在 C# 中一样进行比较,其中如果 x
和 y
都是空引用,x == y
将评估为真。在 SQL 中, 不会 计算为真,因为 null 值不被认为是相等的。
LINQ 旨在模拟您编写的 C# 代码,这就是为什么它会像这样检查是否为空...但是如果您传入的值不为空,它将不会匹配任何具有空值的内容 Division
值。
正如 Evk 所说,如果您使用 Entity Framework,您可以在配置中使用 UseDatabaseNullSemantics
属性 来避免这种情况:
Gets or sets a value indicating whether database null semantics are exhibited when comparing two operands, both of which are potentially nullable. The default value is false. For example (operand1 == operand2) will be translated as: (operand1 = operand2) if UseDatabaseNullSemantics is true, respectively (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) if UseDatabaseNullSemantics is false.
我正在尝试在 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);
当我吐出 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
我做错了什么?
除非你比较的值是null,否则没问题。注意括号:
(
([Extent1].[Division] = @p__linq__0) OR
(([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
基本上,它确保空值像在 C# 中一样进行比较,其中如果 x
和 y
都是空引用,x == y
将评估为真。在 SQL 中, 不会 计算为真,因为 null 值不被认为是相等的。
LINQ 旨在模拟您编写的 C# 代码,这就是为什么它会像这样检查是否为空...但是如果您传入的值不为空,它将不会匹配任何具有空值的内容 Division
值。
正如 Evk 所说,如果您使用 Entity Framework,您可以在配置中使用 UseDatabaseNullSemantics
属性 来避免这种情况:
Gets or sets a value indicating whether database null semantics are exhibited when comparing two operands, both of which are potentially nullable. The default value is false. For example (operand1 == operand2) will be translated as: (operand1 = operand2) if UseDatabaseNullSemantics is true, respectively (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) if UseDatabaseNullSemantics is false.