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



我想使用LINQ to对象来查询几个级别深的对象集合,以提取值。例如,给定一个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;

这样做的问题是层次结构中的任何null对象都会导致null ref异常。有没有一种方法可以构造查询,以某种方式忽略null,而不必首先检查每个对象?(上面是一个简化的例子,我正在处理的项目中的嵌套要深得多。)

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

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永远不能为null,或者x.Communication.CommunicationDetail永远不能为null,那么您可以删除这些检查——在您的模型中什么可以为null还不清楚。

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

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

相关内容

  • 没有找到相关文章

最新更新