C# LINQ:如何使用GROUPBY子句获取Max Id?
我正在寻找一种在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
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()
启用对此的支持。过来看。