我想把多条件置于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。
答案 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“短路评估”。