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

时间:2016-07-15 19:17:57

标签: c# linq

我正在尝试根据一些标准过滤列表,而.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();
            }

如果我使用除了可空字段之外的任何先前条件,我会得到一个完全过滤的列表,如果我添加一个OR“||”然后我在第一个标准上得到 System.NullReferenceException

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

else
                {   
                    data = dal.GetVueTache().Where(t => 
                        t.GetType().GetProperty(champs).GetValue(t).ToString().ToLower().Contains(filtre.ToLower())
                        ).ToList();
                }

这个根据属性“champs”上的条件“filtre”过滤我的列表。它适用于每个属性,但第二个属性可以为空。我知道这是问题的来源,但我无法找到一种方法来测试该属性在评估之前是否为null,并在.Where()方法中解决此问题。

任何建议都将不胜感激!!

修改:

感谢 Ivan Stoev 的解决方案!

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

|| (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()))

1 个答案:

答案 0 :(得分:3)

只需按旧方式进行null检查:

|| (t.ProjetDescription256 != null && t.ProjetDescription256.ToLower().Contains(filtre.ToLower()))

或C#6方式(利用null conditional operator):

|| t.ProjetDescription256?.ToLower().Contains(filtre.ToLower()) == true

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

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();