我正在尝试根据一些条件和 .Where() 函数在同一方法的 2 个部分中给了我一个错误。
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();
}
这个根据属性"冠军"上的"过滤"标准过滤我的列表。它适用于所有属性,但第二个属性除外,第二个属性可为空。我知道这就是问题的来源,但我找不到一种方法来测试该属性是否为 null,然后再对其进行评估并从内部解决此问题。其中() 方法。
任何建议将不胜感激!!
编辑:
感谢伊万·斯托耶夫的解决方案!
在第一种情况下,测试 null 值的正确语法是:
|| (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 方式(使用 null 条件运算符):
|| 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();