Linq Where()函数有多个过滤器。结果错误的结果

时间:2013-12-06 11:23:03

标签: c# linq linqpad

我想把多条件置于where子句中,但不能将结果表示为exprescted。

我正在做什么。在(LinqPad)

void Main()
{
    var lst = new List<Employee>()
    {
     new Employee() { Name="Name1", Address="address1",Desig="Desig1"}, 
     new Employee() { Name="Name2", Address="address2",Desig="Desig2"}, 
     new Employee() { Name="Name3", Address="address3",Desig="Desig3"}, 
     new Employee() { Name="Name4", Address="address4",Desig="Desig4"},
     new Employee() { Name="Name5", Address="address5",Desig="Desig5"},
     new Employee() { Name="Name6", Address="",Desig=""},
     new Employee() { Name="", Address="",Desig="Desig4"},
     new Employee() { Name="Name8", Address="address4",Desig=""}     
    };

var query =     (from d in lst
                select d).ToList();


var filter =query.Where(x=> !string.IsNullOrWhiteSpace(x.Name) && !string.IsNullOrWhiteSpace(x.Address)).ToList();              

filter.Dump();
}

// Define other methods and classes here
public class Employee
{
 public string Name {get;set;}
 public string Address {get;set;}
 public string Desig {get;set;}
}

预期结果显示名称和地址不为空的项目。但得到错误的结果。检查名称或地址是否为空。

Result as 
    Name1   address1    Desig1
    Name2   address2    Desig2
    Name3   address3    Desig3
    Name4   address4    Desig4
    Name5   address5    Desig5
    Name8   address4    

Expected Result

    Name1   address1    Desig1
    Name2   address2    Desig2
    Name3   address3    Desig3
    Name4   address4    Desig4
    Name5   address5    Desig5
    Name6       
    Name8   address4    

似乎Where条件一次只解析一个条件。因此这两种情况都被视为Or Condition。

1 个答案:

答案 0 :(得分:3)

好的,在您编辑后,您的问题现在已经清楚了。

问题是您在查询中使用条件AND &&。如果第一个操作数为false,则不评估第二个操作数,因为结果始终为false,因为两个操作数必须求值为true

您正在做的是检查 地址和名称上的空/空/空格。

这就是记录的原因:

  new Employee() { Name="Name6", Address="",Desig=""},

未出现在您的预期输出中。 Name不为null / empty,但是Address是如此语句返回false并且不包含它。

您的查询应该是:

var filter = query.Where(x => !string.IsNullOrWhiteSpace(x.Name)
             || !string.IsNullOrWhiteSpace(x.Address)).ToList();  

条件OR将确保如果两个操作数中的任何一个的计算结果为true,则整个语句为true。

如果第一个操作数为真,那么第二个操作数不会被评估为a.k.a“短路评估”。