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