Linq:GroupBy 和 Sum

Linq: GroupBy and Sum

我正忙于思考 LINQ。 我正在查询数据库

C 列日期

25-04-2016 10

01-05-2016 8

10-05-2016 4


我需要按年和月进行分组和求和。

我试过这样做但是没用:

public TYPE getX(DateTime value) {

var total = from p in context.table

         .Where(p => p.date.Year == value.Year)                    
                group p by p.date.Year into dp
                select new 
                {
                   
                    result = dp.Sum(s => s.ColumnC),
                    
                };
               

            return total;
}

我也不知道 return 类型。


换句话说:

如何从中获取 linq 查询:

select Month(date) Month ,sum(ColumnC) result

from table 

group by(Month(date))

==============

提前致谢

您在此处的 return 类型部分 anonymous,这意味着您永远无法知道类型。

但是,您可以直接检索结果作为分组的一部分:

public IEnumerable<IGrouping<int, decimal>> getTotalHeures(DateTime value)
{
    var total = from p in context.table
        .Where(p => p.date.Year == value.Year)                    
        .GroupBy(p => p.date.Month, p => p.ColumnC);

    return total;
}

如果你想得到结果,你必须明确地转换你的总和,因此会丢失一些数据。这是必要的,因为您的初始数据是十进制的。因此代码:

var total = (from p in context.table

        .Where(p => p.date.Year == value.Year)                    
            group p by p.date.Month into dp
            select new KeyValuePair<int,int> (dp.Key, (int)dp.Sum(s => s.ColumnC))
            );

这将是 IQueryable<KeyValuePair<int,int>> 的结果,这也是 知道类型 的一种方法。

第二个更正确的选项是不将小数转换为整数,因此代码:

var total = (from p in context.table

        .Where(p => p.date.Year == value.Year)                    
            group p by p.date.Month into dp
            select new KeyValuePair<int,decimal> (dp.Key, dp.Sum(s => s.ColumnC))
            );

结果将是 IQueryable<KeyValuePair<int,decimal>>,这很容易处理。

在这两种情况下,键都是月份,值是列 C 的总和