2

我有以下代码:

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids)
{
    return from id in ids join storedId in storedIds on id equals storedId.Id
        orderby storedId.Something select id;
}

现在我想引入一个参数GetOrdered()并可选地更改orderbyorderby descending. 像这样的东西:

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending)
{
    // how do I insert descending into the query below?
    return from id in ids join storedId in storedIds on id equals storedId.Id
        orderby storedId.Something select id;
}

当然,我可以编写两个相同的查询——一个有orderby,另一个有,orderby descending但这意味着代码重复。

或者,我可以对无序集使用子语句,然后像在这个答案中那样有条件地对其进行排序,但问题是我需要Select()一个特定的列,而后者Select()将呈现一个无序的结果。

因此,我可以尝试制定一个“智能”订购条件,如以下答案所示

var result = from w in widgets where w.Name.Contains("xyz")
  orderby
    flag ? w.Id : 0,
    flag ? 0 : w.Id descending
  select w;

但问题是我经常会有一个非数字列作为我需要订购我的集合的列。

在这些条件下如何有条件地反转排序顺序?

4

2 回答 2

4
IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending = false)
{
    var results = from id in ids join storedId in storedIds on id equals storedId.Id
                  select id;

    if (descending)
       results = results.OrderByDescending(o => o.Something);
    else
       results = results.OrderBy(o => o.Something);

    return results;
}

这是有点标准的东西。

但是,如果您需要按您实际上没有选择的内容进行排序,则需要将查询拆分为多个语句。你知道,一步一步地构建查询,就像我们在 ADO 时代所做的那样。首先进行排序,然后为选择指定列。因为您没有具体化结果,所以它应该只生成一个 sql 查询。

它可能看起来像这样。

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending = false)
{
    var results = storedIds.Where(somecondition);        
    if (descending)
       results = results.OrderByDescending(o => o.Something);
    else
       results = results.OrderBy(o => o.Something);

    return results.Select(o => o.Id);
}

关于你的最后一句话。。

但问题是我经常会有一个非数字列作为我需要订购我的集合的列。

确实如此。可能有一种方法可以克服这个问题(比如使用一些工厂来根据一些输入生成要比较的值),但这对于这样的任务来说确实是一种过度杀伤力。有时最简单的解决方案是最好的。过于笼统的做事方式可能闻起来很糟糕。不要过度思考问题;)

于 2013-06-03T11:27:31.393 回答
3

要在 Linq 中实现条件 OrderBy,您可以执行以下操作:

var flag = sortOrder == "asc";

result.OrderBy(o => flag ? o.Something: "").ThenByDescending(o => flag ? "" : o.Something).ToList();

为我工作。

于 2014-02-10T11:21:15.997 回答