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