当父值可能为null时,OrderBy

时间:2014-01-08 15:21:06

标签: c# linq linq-to-sql data-processing

假设我想按列q in T订购表q.As.OrderByDescending(p => p.Beginning).FirstOrDefault().B.C

但是,q.As.OrderByDescending(p => p.Beginning).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;

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

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

2 个答案:

答案 0 :(得分:2)

如果您使用Linq-to-SQL

,这应该有效
from q in T
orderby q.As.OrderByDescending(p => p.Beginning).FirstOrDefault().B.C
select q;

如果这实际上是Linq-to-Objects,则需要执行此操作

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

答案 1 :(得分:1)

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

你必须决定使用null As和B的记录去哪里。然后,您可以使用已过滤的结果获取已过滤的数据和Union(您可以通过查询where a == null || a.B == null来获取该数据)

如果您希望以前使用空值,请执行nullList.Union(nonNulls)

通过这种方式,您已经订购了空值,然后按顺序排序非空值