Lambda表达式查询空字段

时间:2013-10-07 13:44:04

标签: c# linq lambda nullreferenceexception

好吧,我使用以下查询来搜索LIST,其中包含用户填写的文本。

只有一个文本框可以搜索下面的所有这些字段,它正在工作但是当其中一个字段为空时,它会抛出一个空引用异常,我该如何避免呢?

List<REP_MEDIDORDISPLAY> SearchFiltered = new List<REP_MEDIDORDISPLAY>();
            if (filter != String.Empty)
            {
                SearchFiltered.Clear();
                foreach (String Item in filter.Split(';').ToList<String>())
                {
                    SearchFiltered.AddRange(Medidores.Where(x => x.Data_TOI.Contains(Item.Trim()) ||
                        x.Elemento.ToUpper().Contains(Item.Trim()) ||
                        x.Fase.ToUpper().Contains(Item.Trim()) ||
                        x.ID.ToUpper().Contains(Item.Trim()) ||
                        x.KdKe.ToUpper().Contains(Item.Trim()) ||
                        x.N_Equipamento.ToUpper().Contains(Item.Trim()) ||
                        x.Status.ToUpper().Contains(Item.Trim()) ||
                        x.Tensao.ToUpper().Contains(Item.Trim())));

                }
            }

我希望你们能帮助我。感谢。

4 个答案:

答案 0 :(得分:2)

首先检查null

(x.Elemento != null && x.Elemento.ToUpper().Contains(Item.Trim())) ||
// etc

当然,您还应该只计算一次Item.Trim(),并将此值重复用于所有测试,而不是像字段一样多次修剪。

答案 1 :(得分:2)

您可以为每个属性添加空检查。例如:

x.Fase.ToUpper().Contains(Item.Trim()) || 

 (x.Fase != null && x.Fase.ToUpper().Contains(Item.Trim())) ||

答案 2 :(得分:0)

也许你应该介绍像null object这样的东西。此对象为空,因此在每次查询时都会返回false。

如果对该对象上的每个属性实施nullcheck,则代码会随着时间的推移而腐烂。你会度过一段美好的时光。

答案 3 :(得分:0)

有很多方法可以做你正在做的事情,也许有些更优雅。

一种简单的方法是覆盖ToString序列中对象中的Medidores方法,并将其用于比较。

这样的事情:

class Medidor {
    ... properties

    public override string ToString() {
        return Data_TOI + Elemento ... etc
    }
}

然后你可以与之比较。

SearchFiltered.AddRange(
  Medidores.Where(x => 
    x.ToString()
     .IndexOf(Item.Trim(), 0, StringComparison.InvariantCultureIgnoreCase) != -1
);

我正在使用IndexOf,因为它有一个需要StringComparison.InvariantCultureIgnoreCase的重载,忽略了其他内容。

我认为这种方法比现在更受欢迎的原因是Meridor对象本身负责ToString方法中包含的字段。也许它可以提高可读性和可维护性。