LINQ:如何使用group by子句获取Max Id?

时间:2016-02-03 06:55:49

标签: c# oracle linq group-by max

我正在LINQ中寻找一种方法,通过使用'Group By'子句

来获取最大Id记录

考虑以下样本数据

  Table: ProcessAud

  ProcessSeq     ProjectSeq   ProjectValue    Active
      11              1           50000          Y
      12              1           10000          Y
      13              2           70000          Y 
      14              2           90000          Y

我想在其中获得两个记录作为列表,即第二和第四个   记录(即)ProcessSeq 12和14.我尝试了如下

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

它无法正常工作,那么如何在LINQ中完成它。请任何人帮忙。

4 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助

答案 1 :(得分:2)

您想从每个组中挑选最高记录。

if(value < 4)

检查demo code

答案 2 :(得分:1)

你大部分都在那里,但Max是错误的术语。

每个IGrouping都是自己的IEnumerable(或IQueryable)序列,因此您可以使用OrderByFirst条款来获得答案需要:

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的行。

答案 3 :(得分:0)

使用此代码,您可以获得foreach中的所有最大ID

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