繁体   English   中英

如何有选择地反转Linq-to-Sql中的排序顺序?

[英]How do I optionally reverse the sorting order in Linq-to-Sql?

我有以下代码:

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()引入参数,并可选地用orderby descending更改orderby 像这样:

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;

但是问题是我经常会有一个非数字列,我需要对它进行排序。

在这些条件下如何有条件地颠倒排序顺序?

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);
}

关于你的最后一句话

但是问题是我经常会有一个非数字列,我需要对它进行排序。

确实如此。 可能有一种方法可以解决此问题(例如使用一些工厂,该工厂将根据某些输入生成要与之进行比较的值),但是对于这样的任务,这确实是一个过大的杀伤力。 有时,最简单的解决方案就是最好的解决方案。 太普通的做事方式可能会闻起来很不好。 不要想太多问题;)

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

var flag = sortOrder == "asc";

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

为我工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM