Linq子组聚合问题:补全并修正分组统计代码
数据聚合问题
原始数据表
| Type | Item | Activity | Done |
|---|---|---|---|
| A | Item#1 | Act#1 | True |
| A | Item#1 | Act#2 | True |
| A | Item#1 | Act#3 | False |
| A | Item#2 | Act#1 | True |
| A | Item#2 | Act#2 | True |
| B | Item#3 | Act#1 | False |
| B | Item#3 | Act#2 | True |
| B | Item#3 | Act#3 | False |
期望聚合输出
| Type | ItemsCount | ItemsDone | ItemsRemaining | ActivityCount | ActivityDone | ActivityRemain |
|---|---|---|---|---|---|---|
| A | 2 | 1 | 1 | 5 | 4 | 1 |
| B | 1 | 0 | 1 | 3 | 1 | 2 |
尝试代码
var _result = _itemModel.GroupBy(x => new { x.Type}).Select(y => new { ItemsCount = y.Select(x => x.Item).Distinct().Count(), ItemsDone= ????, ItemsRemaining=????, ActivityCount= y.Count(x => x.Type != null), ActivityDone = y.Count(x => x.Completed == true), ActivityReamin = y.Count(x => x.Completed == false) }).ToList();
修正后的代码
var _result = _itemModel .GroupBy(x => x.Type) // 按Type分组 .Select(typeGroup => { // 在Type组内按Item子分组 var itemGroups = typeGroup.GroupBy(x => x.Item); int itemsCount = itemGroups.Count(); // 统计所有Activity都完成的Item数量 int itemsDone = itemGroups.Count(itemGroup => itemGroup.All(x => x.Done)); int itemsRemaining = itemsCount - itemsDone; int activityCount = typeGroup.Count(); int activityDone = typeGroup.Count(x => x.Done); int activityRemain = activityCount - activityDone; return new { Type = typeGroup.Key, ItemsCount = itemsCount, ItemsDone = itemsDone, ItemsRemaining = itemsRemaining, ActivityCount = activityCount, ActivityDone = activityDone, ActivityRemain = activityRemain }; }) .ToList();
关键说明
- 先按
Type分组,再在每个分组内按Item做二次子分组,实现层级统计 ItemsDone通过All(x => x.Done)判断该Item下所有活动是否全部完成,统计符合条件的Item数量- 剩余统计项通过基础数值计算得出,减少集合遍历次数
内容的提问来源于stack exchange,提问作者Hussein
相关产品推荐
相关产品推荐

