【问题标题】:OrderBy when a parent-value maybe null父值可能为空时的 OrderBy
【发布时间】:2014-01-08 15:21:05
【问题描述】:

假设我想订购表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 中的记录。如何在不过滤任何记录的情况下实现排序?

【问题讨论】:

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


    【解决方案1】:

    如果您使用的是 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
    

    【讨论】:

      【解决方案2】:

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

      您必须决定带有空 As 和 B 的记录的去向。然后你可以得到过滤后的数据和Union它与过滤出的结果(你可以通过查询where a == null || a.B == null得到)

      如果你想让空值出现在前面,请执行nullList.Union(nonNulls)

      这样你已经订购了空值,然后按该顺序订购了非空值

      【讨论】:

      • 与@Aducci 解决方案相比,此解决方案是否会降低性能?我认为完成这种方式需要 3 次操作(2 次选择和 1 次联合)。
      • 是的,会有 2 次排序操作和 1 次合并操作。我认为 Aducci 的解决方案非常好。我的只是你现有代码的一个螺栓。我会和他一起去。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多