如何使用Linq对分组结果进行排序?

40

我有以下的 LINQ 查询,它能够正常工作。但我不确定如何对分组后的结果进行排序。

from a in Audits
join u in Users on a.UserId equals u.UserId
group a by a.UserId into g
select new { UserId = g.Key, Score = g.Sum(x => x.Score) }

目前结果按照用户ID升序排序。我需要按得分降序排序。

谢谢 :)

2个回答

65

只需添加orderby子句;-)

from a in Audits
join u in Users on a.UserId equals u.UserId
group a by a.UserId into g
let score = g.Sum(x => x.Score)
orderby score descending
select new { UserId = g.Key, Score = score };

我尝试了添加一个orderby但是并没有成功。但是你做的是在里面添加了一个LET语句!啊哈..那很有意思... - Pure.Krome
我没有检查,但我认为LET不是必需的。只有“orderby g.Sum(x => x.Score)”就足够了吗? - Arjan Einbu
可以这样做,但是我必须在选择列表中列出g.Sum,那么这样做会使求和操作执行两次吗? - Pure.Krome
嘿,阿尔贾,你的查询和另一个查询在性能方面有什么区别?哪一个更适合在实时应用程序中使用? - Prashant Cholachagudda
我期望性能完全相同。我们现在只是在构建查询。当您实际执行它们时,查询树将看起来相同。 - Arjan Einbu
2
“let” 允许我在 orderby 子句之前定义聚合,这样我就可以对其进行排序!太棒了!为什么这不是常识呢?从现在开始,我将像这样编写所有的 linq 查询。酷的是,你的方法支持多重排序和各种排序方向。例如,“orderby g.Key.UserId ascending, score descending”。建议在查询后使用 OrderBy()、ThenBy() 和 OrderByDescending() 进行链式包装可能会导致多个查询而不是一个,并且看起来不太像 SQL。FYI:您可以通过在第一个“let”语句下面添加另一个“let”语句来添加更多的聚合! - MikeTeeVee

13
var results =
 (from a in Audits
join u in Users on a.UserId equals u.UserId
group a by a.UserId into g
select new { UserId = g.Key, Score = g.Sum(x => x.Score) })
.OrderByDescending(p=>p.Score);

希望这个能解决你的问题,比顶部那个方法更简单 ;)

祝好


1
超过3年后,这个答案仍然对我有帮助! - utsikko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接