Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to对象查询忽略层次结构中的空对象_C#_.net_Linq - Fatal编程技术网

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

C# LINQ to对象查询忽略层次结构中的空对象,c#,.net,linq,C#,.net,Linq,我想使用LINQ to对象查询几个层次的对象集合,以提取一个值。例如,给定一个实体对象,如果标志设置为1,我希望获取emailAddress字符串,否则为空: Entity.CommunicationCollection.Communication.CommunicationDetail.EmailAddress 其中,CommunicationDetail如下所示: public class CommunicationDetail { public int Flag;

我想使用LINQ to对象查询几个层次的对象集合,以提取一个值。例如,给定一个实体对象,如果标志设置为1,我希望获取emailAddress字符串,否则为空:

 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;
我提出的查询如下所示:

 public class CommunicationDetail
 {
     public int Flag;
     public string EmailAddress;
 }
 string email = Entity.CommunicationCollection.FirstOrDefault(x => x.Communication.CommunicationDetail.Flag == 1).EmailAddress;

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

好吧,您要么检查所有内容,要么使用
??
进行默认设置,这仍然会很尴尬。我猜你想要的是:

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;
    }
}
公共类NullChecker,其中T:class
{
公共静态bool IsNotNull(默认(T)类型)
{
返回类型!=null;
}
}

您当前的代码无法编译-我怀疑您想要的是
=
而不是
=
。快速回答:不。您必须自己检查是否为null。此外,如果没有符合条件的对象,FirstOrDefault()将返回null,因此执行
。FirstOrDefault(xxx)。某些
本身是危险的,除非您100%确定它实际上将返回某些内容。您需要
where T:class
来编译它,除非将其与
默认值(T)
进行比较。除非您使用
default(t)
,否则它对可为null的结构也不起作用。。这是否意味着更换myObj=NullChecker.IsNotNull(myObj)无处不在吗?