【问题标题】:Linq pivot indicator values into additional columns and aggregate dataLinq 将指标值转换为附加列并聚合数据
【发布时间】:2018-06-01 12:58:46
【问题描述】:

我正在尝试使用 Linq 进一步聚合我的数据。我有一个设计不正确的学生表,其中包含不必要的重复。我已经获取了数据,并且正在尝试将其汇总以易于阅读。现有数据结构如下:

| Course | Class  | Sex | Count |
---------------------------------
| Math   | Junior | M   | 20    |
| Math   | Junior | F   | 15    |
| Other  | Other  | M   | 10    |
| Other  | Other  | F   | 15    |

我正在尝试将以上内容转换为更简单的结构

| Course | Class  | Male| Female|
---------------------------------
| Math   | Junior | 20  | 15    |
| Other  | Other  | 10  | 15    |

我使用 for 循环来获取不同的课程并按性别获取记录并将它们合并到一个记录中,但这并不是很有效。现在有没有人可以通过Linq 查询来实现这一点,我认为它可以由Linq 处理。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以在 Linq 中一次性完成此操作,按课程和班级分组(我使用了 ValueTuple,但匿名班级分组密钥也可以)。

    然后通过过滤和总结男性和女性获得总和:

    var results = courseCounts
         .GroupBy(cc => (cc.Course, cc.Class))
         .Select(grp => new 
                 {
                     Course = grp.Key.Course,
                     Class = grp.Key.Class,
                     Male = grp.Where(x => x.Sex == "M").Sum(x => x.Count),
                     Female = grp.Where(x => x.Sex == "F").Sum(x => x.Count)
                 });
    

    (次要,但从较大数据集的性能角度来看,重复 .Where(x => x.Sex == "x") 两次效率有点低 - 例如,我们可以先将数据键入 Grouping + Dictionary

    【讨论】:

    • 嘿 StuartLC 谢谢你完美的工作。如果我使用 DataTables 而不是模型,因为我没有 cc.Course,你能给我一个指针,我将如何实现它?为额外的问题道歉。
    • 你可以直接从数据库获取,如果你想/可以写一个查询。 @smned
    • @smned 实际上应该只是用Dictionary 样式属性查找和强制转换替换强属性值的问题,例如cc.Course 变为 cc["Course"].ToString()Sum(x => x.Count) 将是 Sum(x => int.Parse(x["Count"])). But personally, I would rather take the time to parse the DataTable` 进入强类型 POCO(甚至避免使用 DataTable,例如使用 Dapper 样式的强类型查询加载数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2022-09-27
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多