C# 如何在Linq进行汇总?

C# 如何在Linq进行汇总?,c#,linq,C#,Linq,如果以前有人问过,我会道歉,但我不确定我问的问题是否正确。 我的问题是: 我有以下数据: AA01 JAN 100 AA01 JAN 200 AA01 FEB 200 AA02 JAN 50 AA03 FEB 500 AA03 MAR 250 AA03 MAR 75 我想把它变成一个结果,看起来像: Result{ string Key, int Jan, int Feb, int Mar, ... } IEnumerable<Result> results

如果以前有人问过,我会道歉,但我不确定我问的问题是否正确。 我的问题是:

我有以下数据:

AA01 JAN 100
AA01 JAN 200
AA01 FEB 200
AA02 JAN 50
AA03 FEB 500
AA03 MAR 250
AA03 MAR 75
我想把它变成一个结果,看起来像:

Result{
  string Key,
  int Jan,
  int Feb,
  int Mar,
  ...
 }

IEnumerable<Result> results = .....
KEY   JAN   FEB   MAR
AA01  300   200     0
AA02   50     0     0
AA03    0   500   325
结果{
字符串键,
1月1日,
今年二月,,
今年三月,
...
}
IEnumerable结果=。。。。。
关键一月二月三月
AA01 300 200 0
AA02 50 0 0
AA03 0 500 325
如果这有帮助的话,月份列是固定的,但是我无法解决如何获得linq查询来生成这些结果? 我可以在标准循环中反复迭代数据并添加到结果中,但这听起来是错误的做法


感谢您的帮助:)

我不确定如何直接在Linq中执行此操作,但一种方法是执行以下操作:

  • 获取所有不同的键(
    var-keys=myData.Select(d=>d.Key).distinct();
  • 创建一个
    词典
    -这将保存您的密钥作为第一个词典的密钥,月份作为第二个词典的密钥
  • 迭代不同的键和月份,并将所有值添加到字典中,这样就可以有效地得到一个充满0的表
  • 迭代数据,进行相关查找,并根据需要添加到数字中

  • 以下是我知道的最简单的方法:

    var query =
        from r in records
        group r by r.Key into grs
        let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
        select new
        {
            grs.Key,
            JAN = ms["JAN"].Sum(),
            FEB = ms["FEB"].Sum(),
            MAR = ms["MAR"].Sum(),
            // ...
            DEC = ms["DEC"].Sum(),
        };
    
    从计算角度来看,另一种更灵活的方法是不完全按照您想要的格式执行:

    var months = Enumerable
        .Range(0, 12)
        .Select(m =>
            String
                .Format("{0:MMM}", new DateTime(2011, m + 1, 1))
                .ToUpper());
    
    var query =
        from r in records
        group r by r.Key into grs
        let ms = grs.ToLookup(gr => gr.Month, gr => gr.Value)
        select new
        {
            grs.Key,
            Months =
                from m in months
                select ms[m].Sum(),
        };
    

    这里提供了非常有趣的解决方案

    它描述了如何通过几个属性执行groupbby。即:

    var result = customers.GroupByMany(c => c.Country, c => c.City);
    

    查一下你的消息来源?DataTable?Source是一个完整的SQL数据库模型。与另一个版本相比,它的总和集要大得多。你说的“更大的总和集”是什么意思?链接已断开。