LINQ to Objects查询忽略层次结构中的空对象

时间:2013-02-05 14:41:02

标签: c# .net linq

我想使用LINQ-to-objects来查询几个级别的对象集合,以提取值。例如,给定一个Entity对象,如果一个标志设置为1,我想获取emailAddress字符串,否则为null:

 Entity.CommunicationCollection.Communication.CommunicationDetail.EmailAddress

CommunicationDetail的样子如下:

 public class CommunicationDetail
 {
     public int Flag;
     public string EmailAddress;
 }

我提出的查询看起来像这样:

 string email = Entity.CommunicationCollection.FirstOrDefault(x => x.Communication.CommunicationDetail.Flag == 1).EmailAddress;

这个问题是层次结构中的任何空对象都会导致空引用异常。有没有办法构建查询以某种方式忽略空值,而不首先检查每个对象? (上面是一个简化的例子,我正在研究的项目中的嵌套要深得多。)

2 个答案:

答案 0 :(得分:3)

好吧,你要么必须检查所有内容,要么使用??进行默认,这仍然很尴尬。我怀疑你想要的东西:

var email = Entity.CommunicationCollection
                  .Where(x => x.Communication != null &&
                              x.Communication.CommunicationDetail != null &&
                              x.Communication.CommunicationDetail.Flag == 1)
                  .Select(x => x.Communication.CommunicationDetail.EmailAddress)
                  .FirstOrDefault();

请注意,此处email仍然可以是null ...

显然,如果x.Communication永远不能为空,或者x.Communication.CommunicationDetail永远不能为空,那么您可以删除这些检查 - 不清楚模型中什么可以为null。

答案 1 :(得分:1)

我强烈建议使用名为IsNull或IsNotNull的泛型方法创建一个类,并允许它接受任何任何对象类型并检查对象以查看它是否为null。这样您就不必对要查询的每个对象进行单独验证

public class NullChecker where T : class
{
    public static bool IsNotNull<T>(default(T) type)
    {
        return type != null;
    }
}