在 Linq 中对集合使用 SUM 和 GROUP BY

Using SUM & GROUP BY on Collection in Linq

我想在 linq 中使用 SUM & GOUP BY。我在 collection 中有记录并且想使用下面的 query 通过 linq

collection 上执行
public class Summary
    {
        public int Month { get; set; }
        public int Year { get; set; }        
        public double Wages { get; set; }
        public double AccNo22 { get; set; }
        public double AccNo21 { get; set; }

    }

List<Summary> list = new List<Summary>();

for (int i = 0; i < data.Rows.Count; i++)
{

     Summary model = new Summary();

     model.Month = int.Parse(data.Rows[i]["MonthNumber"].ToString());
     model.Year = int.Parse(data.Rows[i]["Year"].ToString());         
     model.AccNo22 = 0;
     model.AccNo21 = 0;

     list.Add(model);   
}

查询:-

SELECT Year, Month, SUM(ACCNO21) AS ACC21,SUM(ACCNO22) AS ACC22 FROM AboveList
WHERE  (((Month >=  3  AND Month <= 12) AND Year = '2015') OR ((Month >= 1  AND Month <= 2) AND Year = '2016')) 
    GROUP BY Month,Year")

我正在尝试 :-

var newCollection = list
    .GroupBy(a => a.Month, b => b.Year)
    .Select(a => new { Wages = a.Sum(a.Wages)})    
    .ToList();

你需要这样投影:-

 .Select(a => new { Wages = a.Sum(b => b.Wages)})

AccNo22、AccNo21 等依此类推

这是完整的查询:-

var result= list.Where(x => (x.Month >= 3 && x.Month <=12 && x.Year == 2015) ||
                              (x.Month >=1 && x.Month <=2 && x.Year == 2016)
                      )
                    .GroupBy(x => new {x.Month, x.Year})
                    .Select(x => new {
                         Year = x.Key.Year,
                         Month = x.Key.Month,
                         AccNo21 = x.Sum(z => z.AccNo21),
                         AccNo22 = x.Sum(z => z.AccNo22)
                    });

嗯,您可以先过滤列表,然后按 select 元素分组。

var newCollection = list
                    .Where(m => (m.Month >= 3 && m.Month <=12 && m.Year == 2015) ||
                                (m.Month >=1 && m.Month <=2 && m.Year == 2016)
                          )
                    .GroupBy(m => new{m.Month, m.Year})
                    .Select(m => new {
                         year = m.Key.Year,
                         month = m.Key.Month,
                         AccNo21 = m.Sum(g => g.AccNo21),
                         AccNo22 = m.Sum(g => g.AccNo22)
                    });