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

例如,给定的学生表

ID Name Class Score
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来实现上述目标?

推荐答案

您可以执行类似于从分组中 Select 的操作,这应该使用窗口函数

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;

另一种 Select ,不会产生平局结果

from o in Students
group o by o.Class into g
select g.OrderByDescending(x => x.Score).First();

Csharp相关问答推荐

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

选取器与.NET Maui MVVM的绑定属性

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

Blazorise折线图仅绘制数据集的一部分

如何管理Azure认证客户端响应和证书 fingerprint

当使用Dapper映射DBNull时,我可以抛出异常吗?

HelperText属性不支持复杂内容(混合C#和标记)

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

如何防止Visual Studio断点以红色突出显示到整行?

如何从另一个类的列表中按ID取值

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

为什么C#/MSBuild会自发地为不同的项目使用不同的输出路径?

如何从非异步任务中正确返回TypeResult

如何在Xamarin.Forms中检索PanGesture事件的位置?

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

获取应用程序版本信息时出现奇怪信息

游戏对象走向不同的方向

阻止CLR释放已封送的双字符指针的内存?

C#如何替换两个XML元素值?