具有多个属性的LINQ查询,其中一些属性为null

时间:2015-03-30 18:28:47

标签: c# linq

我在.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”,它将包括(作为一些可能的例子):

  • w.Number ==“ABCD”
  • w.SN ==“01234ABC”
  • w.Model ==“ABC”
  • w.Location ==“ABC Co Incorporated”

一切顺利,直到查询在包含null的字符串属性的属性上运行:

  • w.SN == null
    (请注意,如果w.SN ==“null”这不是同一个问题,并且不会抛出相同的错误)

有没有办法绕过此语句中的null属性,而无需重构w的属性?

顺便说一句,我还没有在MSDN的有用网站“how to: write LINQ queries”上找到任何内容......

2 个答案:

答案 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.Numberw.Modelw.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