我正在尝试在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
我做错了什么?
答案 0 :(得分:5)
除非您所比较的值为null,否则它会没问题。请注意包围:
List<List<String>> contacts = myServiceBinder.getContacts(txt);
for(List<String> con : contacts) {
String[] array = new String[con.size()];
con.toArray(array); // fill the array
Log.wtf("test",array[0]+" : "+array[1]);
}
基本上它确保将空值与C#中的值进行比较,如果(
([Extent1].[Division] = @p__linq__0) OR
(([Extent1].[Division] IS NULL) AND (@p__linq__0 IS NULL))
)
和x == y
都是空引用,则x
将评估为真。在SQL中,不会评估为true,因为空值不被认为是相等的。
LINQ旨在模拟您编写的C#代码,这就是为什么它会像这样检查null ...但是如果传入的值不为null,则它将不会与null {{1}的任何内容匹配}值。
正如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。