【问题标题】:Merge results of 2 LINQ To SQL queries and keep their ordering合并 2 个 LINQ To SQL 查询的结果并保持它们的顺序
【发布时间】:2014-01-07 17:15:19
【问题描述】:

我需要将一个 LINQ To SQL 查询的结果附加到数据库服务器端的另一个查询而不重新排序行。

我首先需要所有错误订单,然后是挂单。

var error = database.Orders.
    Where(o => o.Status == XOrderStatus.Error).
    OrderByDescending(o => o.Id);
var pending = database.Orders.
    Where(o => o.Status == XOrderStatus.PendingReview).
    OrderByDescending(o => o.Id);
    var r = error.OrderedUnion(pending);

如何实现OrderedUnion() 方法? ConcatUnionDistinct 方法完全消除了 OrderByDescending 调用(按设计)。

我知道可以使用两个 ToArray() 调用,但我有兴趣在数据库级别完成此操作。

【问题讨论】:

    标签: c# linq-to-sql concatenation


    【解决方案1】:

    您可以将它们连接在一起,然后按分隔订单组的列进行排序。因此,例如在 SQL 查询中,您可以这样做:

    ORDER BY XOrderStatus, Id

    这将按 ID 排序,但将两个 OrderStatuse 分组。

    我不知道 linq to sql(对不起!),但谷歌快速提到这可能有效:

    .Orderby(o => o.XOrderStatus).ThenBy(o => o.Id)

    原文来源:

    Multiple "order by" in LINQ

    【讨论】:

    • 嗯,很好的答案。它给出了一个想法。我根据您的“分组”方法用解决方案更新了我的问题。
    • 只使用一个常量(select new { OrderPrefix = 1, OtherFields... })。
    【解决方案2】:

    我找到了更好的解决方案:

    var all = database.Orders.
        Where(o =>
            o.Status == XOrderStatus.Error ||
            o.Status == XOrderStatus.PendingReview).
        OrderBy(o => o.Status == XOrderStatus.Error ? 0 : 1).
        ThenByDescending(o => o.Id).
        ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多