有没有更好的方法通过使用 LINQ 获取计算组的整行

Is there a better way to get full row of calculated group by using LINQ

提问人:Rob Lao 提问时间:11/15/2023 更新时间:11/15/2023 访问量:49

问:

这个问题是ttps://stackoverflow.com/questions/157786/how-do-i-get-the-max-row-with-a-group-by-in-linq-query 的另一个问题。除了最大值和组键之外,我还需要行的每一列(包括最重要的一列:ID)。

例如,给定的 students 表

编号 名字 得分
1 N0型 C0型 0
2 N1型 C0型 1
3 N2型 C1型 1
4 N3型 C1型 2
5 N4型 C1型 3
6 N5型 C2型 4
7 N6型 C2型 5

为了让整排得分最高的学生按班级分组,我想出了一种方法,但对它的简单性不满意:

from o in Students
join o1 in
  (from oo in Students
   group oo by oo.Class
   into g
   select new { Class = g.Key, MaxScore = g.Max(x => x.Score)})
on o.Class + o.Score equals o1.Class + o1.MaxScore 
select o

我的问题是:有没有更简单的方法是使用 LINQ 或原始 MSSQL 来实现上述目标?

C# LINQ T-SQL

评论

0赞 Gert Arnold 11/15/2023
它始终取决于支持 LINQ 查询形状的确切 ORM(+ 版本),因此请为正在使用的 ORM 添加标记。

答:

1赞 Charlieface 11/15/2023 #1

您可以执行一些操作,例如从分组中进行选择,这应该使用窗口函数

from o in Students
group o by o.Class into g
from s in g
where s.Score == g.Max(x => x.Score)
select s;

另一种选择,它不会给出平局的结果

from o in Students
group o by o.Class into g
select g.OrderByDescending(x => x.Score).First();
0赞 Dewald Oosthuizen 11/15/2023 #2

您也可以将其拆分为:

  1. 按班级对学生进行分组,并找到每个班级的最高分。
  2. 加入在各自班级中获得最高分的原始学生名单。