我正在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中完成它。请任何人帮忙。
答案 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)
答案 2 :(得分:1)
你大部分都在那里,但Max
是错误的术语。
每个IGrouping
都是自己的IEnumerable
(或IQueryable
)序列,因此您可以使用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的行。
答案 3 :(得分:0)
使用此代码,您可以获得foreach中的所有最大ID
var ProcessAudList = ProcessAudService.Where(x => x.Active == "Y")
.GroupBy(x => x.ProjectSeq, (key,g)=>g.OrderByDescending(e=>e.ProjectValue).First());