如何使用LINQ按多列分组

16 浏览
0 Comments

如何使用LINQ按多列分组

这个问题的答案已经在这里了:

按多个列分组

我有一个包含多行数据的数据库表,如下所示:

ItemId               Code                             StatusId
-------------------- ---------------------------------------------
62224                NC0860000                             8
62225                NC0860000                             8
62226                NC0860000                             8
62227                NC0860200                             5
62228                NC0860000                             5
62229                NC0860000                             5
62230                NC0860000                             5

我想实现的是一个输出结果,如下:

NC0860000  8  3  (code, status, count)
NC0860000  5  3

我不完全理解 EF 中的分组是如何工作的。我可以使用以下查询获取单个组的键和计数:

var results = (from ssi in ctx.StageSubmitItems
                           join s in ctx.StageSubmissions on ssi.SubmissionId equals s.SubmissionId
                           where s.ContributorCode == contributorId
                           group ssi.SubmitItemId by ssi.AgencyCode into g
                           select new {AgencyCode = g.Key, Count = g.Count() }).ToList();

但我无法弄清楚如何按代码和状态 ID 分组,然后按状态的总行数产生一个计数。

我会感激任何关于如何完成这个任务或者我在查询中做错了什么的建议。

admin 更改状态以发布 2023年5月22日
0
0 Comments

你可以按以下方式将数据分组成新的匿名类:

// I created a Foo class to show this working
var fooList = new List {
    new Foo { ItemId = 62224, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62225, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62226, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62227, Code = "NC0860200", StatusId = 5 },
    new Foo { ItemId = 62228, Code = "NC0860000", StatusId = 5 },
    new Foo { ItemId = 62229, Code = "NC0860000", StatusId = 5 },
    new Foo { ItemId = 62230, Code = "NC0860000", StatusId = 5 },
};
var results = (from ssi in fooList
    // here I choose each field I want to group by
    group ssi by new { ssi.Code, ssi.StatusId } into g
    select new { AgencyCode = g.Key.Code, Status = g.Key.StatusId, Count = g.Count() }
).ToList();
// LINQPad output command
results.Dump();

根据提供的数据,以下是输出结果:

AgencyCode Status Count
NC0860000  8      3 
NC0860200  5      1 
NC0860000  5      3 

我猜“NC0860200”是一个错误,但它在你的示例数据中,所以我包含了它。

0