我在.NET 4.5框架中使用C#创建了一个LINQ查询。
查询通过将字符串FilterInput
与多个属性进行比较来缩小列表范围,所有属性都是字符串:
tempList = tempList.FindAll(w =>
w.Number.Contains(FilterInput) ||
w.SN.Contains(FilterInput) ||
w.Model.Contains(FilterInput) ||
w.Location.Contains(FilterInput));
所以,如果FilterInput
是“ABC”,它将包括(作为一些可能的例子):
一切顺利,直到查询在包含null
的字符串属性的属性上运行:
null
有没有办法绕过此语句中的null
属性,而无需重构w
的属性?
顺便说一句,我还没有在MSDN的有用网站“how to: write LINQ queries”上找到任何内容......
答案 0 :(得分:1)
尝试添加w.SN != null &&
:
tempList = tempList.FindAll(w =>
w.Number.Contains(FilterInput) ||
w.SN !=null && w.SN.Contains(FilterInput) ||
w.Model.Contains(FilterInput) ||
w.Location.Contains(FilterInput));
如果其他参数(w.Number
,w.Model
,w.Location
)也可以null
,则需要添加类似的检查。
答案 1 :(得分:1)
无论类属性的数量如何:
举个例子:
public class test
{
public string p1 { get; set; }
public string p2 { get; set; }
public string p3 { get; set; }
public int p4 { get; set; }
}
...
test t1 = new test
{
p1 = null,
p2 = "test1",
p3 = "test2",
p4 = 0
};
test t2 = new test
{
p1 = "test1",
p2 = "test2",
p3 = "test3",
p4 = 0
};
test t3 = new test
{
p1 = "test1",
p2 = "tst2",
p3 = "test3",
p4 = 0
};
string filterInput = "test";
var testStringProperties = typeof(test)
.GetProperties()
.Where(p => p.PropertyType == typeof(string));
var a1 = testStringProperties.All(p =>
{
string tempValue = (string)p.GetValue(t1);
return tempValue != null && tempValue.Contains(filterInput);
});
var a2 = testStringProperties.All(p =>
{
string tempValue = (string)p.GetValue(t2);
return tempValue != null && tempValue.Contains(filterInput);
});
var a3 = testStringProperties.All(p =>
{
string tempValue = (string)p.GetValue(t3);
return tempValue != null && tempValue.Contains(filterInput);
});
//a1=false
//a2=true
//a3=false