C# 父值可能为空时的OrderBy

C# 父值可能为空时的OrderBy,c#,linq,linq-to-sql,data-processing,C#,Linq,Linq To Sql,Data Processing,假设我想在T中按列对表q进行排序q.As.OrderByDescending(p=>p.beging).FirstOrDefault().B.C 但是,q.As.OrderByDescending(p=>p.beging).FirstOrDefault()或a.B可能是null,我如何实现它 我当前的代码: from q in T let a = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault() where a != nul

假设我想在T中按列对表
q进行排序
q.As.OrderByDescending(p=>p.beging).FirstOrDefault().B.C

但是,
q.As.OrderByDescending(p=>p.beging).FirstOrDefault()
a.B
可能是null,我如何实现它

我当前的代码:

from q in T
let a = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault()
where a != null
let b = a.B
where b!= null
orderby b.C
select q;


但是,该代码仅显示具有As和B中所有值的记录。如何在不过滤任何记录的情况下实现排序?

您可以使用现有的解决方案。只需将过滤后的数据与过滤后的数据的倒数合并即可

您必须决定带有null As和B的记录的去向。然后,您可以获得过滤后的数据,并将其与过滤后的结果结合起来(您可以通过查询a==null | | a.B==null
来获得该数据)

如果您想让空值先于空值,请执行
nullList.Union(非空值)


通过这种方式,您已经对空值进行了排序,然后按照该顺序对非空值进行了排序

如果您使用的是Linq to SQL,那么这应该是可行的

from q in T
orderby q.As.OrderByDescending(p => p.Beginning).FirstOrDefault().B.C
select q;
如果这实际上是Linq到对象,则需要执行此操作

from q in T
let x = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault()
orderby x == null ? null : x.B.C
select q

与@Aducci解决方案相比,此解决方案是否会降低性能?我认为用这种方法需要3个操作(2个选择和1个并集)。是的,将有2个排序操作和一个合并操作。我认为阿杜奇的解决方案非常好。我的只是你现有代码的一个插销。我会和他一起去。
from q in T
let x = q.As.OrderByDescending(p => p.Beginning).FirstOrDefault()
orderby x == null ? null : x.B.C
select q