You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条LINQ查询实现嵌套分组并生成指定GroupModel列表?

用单条LINQ查询生成指定结构的List

问题背景

现有如下数据表格:

dateTypeAgencyTotalCountABC_CountDEF_CountGHI_Count
JAN-2022XB2X5523
JAN-2022XC4A7572
FEB-2022XB2X3231
FEB-2022XC4A9194
MAR-2022XB2X8318
MAR-2022XC4A7117
JAN-2022YD5Y6643
JAN-2022YE7T7372
FEB-2022YD5Y4241
FEB-2022YE7T9294
MAR-2022YD5Y8318
MAR-2022YE7T8118

已定义C#模型类:

public class GroupModel {
    public string LetterGroupName { get; set; }
    public List<LetterGroupData> LetterGroupData { get; set; }
}

public class LetterGroupData {
    public string Date { get; set; }
    public double TypeX_Ave { get; set; }
    public double TypeY_Ave { get; set; }
    public int Total { get; set; }
}

需要生成List<GroupModel>类型结果集,各字段计算规则:

  • Total:对应日期下Type X和Y的TotalCount总和
  • TypeX_Ave:(对应日期下Type X的目标Count字段总和 / 该日期Total)*100
  • TypeY_Ave:(对应日期下Type Y的目标Count字段总和 / 该日期Total)*100
  • 需按ABC、DEF、GHI三个分组分别统计

解决方案

可以通过单条LINQ查询实现,核心思路是先按日期聚合计算总TotalCount,再针对每个字母分组(ABC/DEF/GHI),结合日期维度计算对应平均值:

var result = new[] { "ABC", "DEF", "GHI" }
    .Select(groupName => new GroupModel
    {
        LetterGroupName = groupName,
        LetterGroupData = dt.AsEnumerable()
            .GroupBy(row => row.Field<string>("date"))
            .Select(dateGroup =>
            {
                var total = dateGroup.Sum(row => row.Field<int>("TotalCount"));
                var typeXSum = dateGroup.Where(row => row.Field<string>("Type") == "X")
                    .Sum(row => row.Field<int>($"{groupName}_Count"));
                var typeYSum = dateGroup.Where(row => row.Field<string>("Type") == "Y")
                    .Sum(row => row.Field<int>($"{groupName}_Count"));

                return new LetterGroupData
                {
                    Date = dateGroup.Key,
                    Total = total,
                    TypeX_Ave = total == 0 ? 0 : Math.Round((double)typeXSum / total * 100, 1),
                    TypeY_Ave = total == 0 ? 0 : Math.Round((double)typeYSum / total * 100, 1)
                };
            })
            .OrderBy(data => data.Date)
            .ToList()
    })
    .ToList();

代码说明

  1. 先枚举三个目标分组(ABC/DEF/GHI),逐个构建GroupModel
  2. 对每个分组,将DataTable行按日期分组:
    • 计算该日期下所有Type的TotalCount总和total
    • 分别统计Type X和Y对应分组Count字段的总和
    • 按公式计算平均值,处理除数为0的边界情况,保留一位小数(可按需调整)
  3. 按日期排序后封装为LetterGroupData列表,最终组合成List<GroupModel>

内容的提问来源于stack exchange,提问作者ricksley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:35:25