Linq multiple where子句没有或

时间:2018-04-11 19:50:18

标签: 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);

当我吐出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 

我做错了什么?

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。