C# LINQ:如何使用GROUPBY子句获取Max Id?

C# LINQ:如何使用GROUPBY子句获取Max Id?,c#,oracle,linq,group-by,max,C#,Oracle,Linq,Group By,Max,我正在寻找一种在LINQ中通过使用'GROUPBY'子句获得max Id记录的方法 考虑以下示例数据 Table: ProcessAud ProcessSeq ProjectSeq ProjectValue Active 11 1 50000 Y 12 1 10000 Y 13 2

我正在寻找一种在LINQ中通过使用'GROUPBY'子句获得max Id记录的方法

考虑以下示例数据

  Table: ProcessAud

  ProcessSeq     ProjectSeq   ProjectValue    Active
      11              1           50000          Y
      12              1           10000          Y
      13              2           70000          Y 
      14              2           90000          Y
其中我想得到两条记录作为一个列表,即第二条和第四条
记录(即)流程Seq 12和14。我试着跟在后面

var ProcessAudList = ProcessAudService.FilterBy(x => x.Active == "Y"    
  ).GroupBy(x => x.ProjectSeq).Max().ToList();

它不能正常工作,因此如何在LINQ中执行它。请任何人帮助。

使用此代码,您可以在foreach中获得所有max id

var res = from pa in ProcessAud
      group Cm by pa.ProjectSeq into Cm1
      select new
      {
           _max = Cm1.Max(x => x.ProcessSeq)
      };
foreach (var item in res)
{
    //item._max have biggest id in group
}

您希望从每个组中选出最佳记录

var ProcessAudList = ProcessAudService.Where(x => x.Active == "Y")
.GroupBy(x => x.ProjectSeq, (key,g)=>g.OrderByDescending(e=>e.ProjectValue).First());

检查

您已经了解了大部分情况,但是
Max
是一个错误的术语

每个
i分组
都是自己的
i可数
(或
i可数
)序列,因此您可以使用
OrderBy
First
子句来获得所需的答案:

var ProcessAudList = ProcessAudService
    .FilterBy(x => x.Active == "Y")
    .GroupBy(x => x.ProjectSeq)
    .Select(grp => grp.OrderByDescending(x => x.ProcessSeq).First())
    .ToList();

Select
子句将处理每个组,按
ProcessSeq
对组进行降序,然后选择第一个组。对于您提供的数据,这将选择
ProcessSeq
等于12和14的行。

当您使用GroupBy扩展时,方法将返回您的IGrouping实例,您应该像下面这样查询IGrouping实例

var ProcessAudList = collection.Where(x => x.Active == "Y").GroupBy(x => x.ProjectSeq).Select(x => x.OrderByDescending(a => a.ProcessSeq).FirstOrDefault()).ToList();

希望这能有所帮助

是的,这是正确的方法,但只有一件事我们应该改变,那就是SingleOrDefault()而不是First()。感谢您的回复。事实上,它应该是
FirstOrDefault()
在ef core>3中不工作@Zodchiy EF不是这个问题的一部分。令人遗憾的是,他们决定破坏一堆现有的代码,但这是他们的过渡性。显然,您可以在
ROW_NUMBER()
实现中使用horn来执行类似的操作,就在服务器端。而且,这已经超过5年了。让它去吧:)这篇文章真的帮助了我。但是我花了很多时间寻找问题,为什么你的例子中所有的东西都能工作,以及我的代码中的错误。@TheZodchiy在原生SQL中,我会用
ROW\u NUMBER()
来解决这个问题。EF Core 2可以使用
sqlOptions.AddRowNumberSupport()
启用对此的支持。过来看。