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