-1

我想使用 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;

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

4

2 回答 2

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永远不能为空,您可以删除这些检查 - 目前尚不清楚您的模型中什么可以为空。

于 2013-02-05T14:46:56.933 回答
1

我强烈建议使用称为 IsNull 或 IsNotNull 之类的通用方法创建一个类,并允许它采用任何对象类型并检查对象是否为空。这将使您不必对正在查询的每个对象进行单独的验证

public class NullChecker where T : class
{
    public static bool IsNotNull<T>(default(T) type)
    {
        return type != null;
    }
}
于 2013-02-05T14:47:02.743 回答