C# 具有多个条件的列表上的函数返回错误

C# 具有多个条件的列表上的函数返回错误,c#,linq,C#,Linq,我试图根据一些条件筛选列表,而.Where()函数在同一方法的两个部分中给出了一个错误 if (string.IsNullOrWhiteSpace(champs)) { data = dal.GetVueTache().Where(t => t.ProjetDescription64.ToLower().Contains(filtre.ToLower())

我试图根据一些条件筛选列表,而.Where()函数在同一方法的两个部分中给出了一个错误

if (string.IsNullOrWhiteSpace(champs))
            {
                data = dal.GetVueTache().Where(t =>
                    t.ProjetDescription64.ToLower().Contains(filtre.ToLower()) 
                    // *This Line || t.ProjetDescription256.ToLower().Contains(filtre.ToLower())
                    || t.Description256.ToLower().Contains(filtre.ToLower())
                    ||t.ResponsableNomCourt.ToLower().Contains(filtre.ToLower())
                    || t.PrioriteDesc.ToLower().Contains(filtre.ToLower())
                    ).ToList();
            }
如果我使用了除可空字段上的条件之外的任何以前的条件,我会得到一个关于该条件的完全过滤列表,如果我添加了或“| |”,那么我会在第一个条件上得到System.NullReferenceException


我在同一方法的另一部分也有类似的问题

else
                {   
                    data = dal.GetVueTache().Where(t => 
                        t.GetType().GetProperty(champs).GetValue(t).ToString().ToLower().Contains(filtre.ToLower())
                        ).ToList();
                }
这一个根据属性“champs”上的条件“filter”筛选我的列表。它对每个属性都有效,但第二个属性是可为空的。我知道这就是问题的根源,但我找不到一种方法来测试属性是否为null,然后再对其求值,并在.where()方法中解决这个问题

任何建议都将不胜感激


编辑:

感谢伊万·斯托夫的解决方案

在第一种情况下测试空值的正确语法是:

|| (t.ProjetDescription256 != null && t.ProjetDescription256.ToLower().Contains(filtre.ToLower()))
在第二种情况下:

(t.GetType().GetProperty(champs).GetValue(t) != null && t.GetType().GetProperty(champs).GetValue(t).ToString().ToLower().Contains(filtre.ToLower()))

只需执行
null
检查,方法如下:

|| (t.ProjetDescription256 != null && t.ProjetDescription256.ToLower().Contains(filtre.ToLower()))
或C#6方式(利用):

顺便说一句,通过编写如下简单的自定义扩展方法,您可以大大简化类似的检查并避免此类错误:

public static class StringExtensions
{
    public static bool ContainsIgnoreCase(this string source, string target)
    {
        return source == null ? target == null : target != null && source.IndexOf(target, StringComparison.CurrentCultureIgnoreCase) >= 0;
    }
}
因此,您的代码片段变得简单:

data = dal.GetVueTache().Where(
    t => t.ProjetDescription64.ContainsIgnoreCase(filtre) 
    || t.ProjetDescription256.ContainsIgnoreCase(filtre)
    || t.Description256.ContainsIgnoreCase(filtre)
    || t.ResponsableNomCourt.ContainsIgnoreCase(filtre)
    || t.PrioriteDesc.ContainsIgnoreCase(filtre)
).ToList();

只需执行
null
检查,方法如下:

|| (t.ProjetDescription256 != null && t.ProjetDescription256.ToLower().Contains(filtre.ToLower()))
或C#6方式(利用):

顺便说一句,通过编写如下简单的自定义扩展方法,您可以大大简化类似的检查并避免此类错误:

public static class StringExtensions
{
    public static bool ContainsIgnoreCase(this string source, string target)
    {
        return source == null ? target == null : target != null && source.IndexOf(target, StringComparison.CurrentCultureIgnoreCase) >= 0;
    }
}
因此,您的代码片段变得简单:

data = dal.GetVueTache().Where(
    t => t.ProjetDescription64.ContainsIgnoreCase(filtre) 
    || t.ProjetDescription256.ContainsIgnoreCase(filtre)
    || t.Description256.ContainsIgnoreCase(filtre)
    || t.ResponsableNomCourt.ContainsIgnoreCase(filtre)
    || t.PrioriteDesc.ContainsIgnoreCase(filtre)
).ToList();

你确定需要使用ToLower吗?我使用它来使搜索参数不区分大小写。你确定需要使用ToLower吗?我使用它来使搜索参数不区分大小写。第二个在.Where()函数的上下文中似乎不起作用,但第一个起作用了!非常感谢。一旦这是LINQ到对象,两者都应该工作。如果LINQ指向实体,则原始查询不应引发NRE。第二个查询在.Where()函数的上下文中似乎不起作用,但第一个查询起作用了!非常感谢。一旦这是LINQ到对象,两者都应该工作。如果LINQ指向实体,则原始查询不应引发NRE。