假设我想按列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中所有值的记录。如何在不过滤任何记录的情况下实现排序?
答案 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)
通过这种方式,您已经订购了空值,然后按顺序排序非空值