Linq:GroupBy和Sum

时间:2016-05-22 11:20:33

标签: c# .net linq-to-sql

我在LINQ周围度过了最艰难的时光。 我正在查询数据库

date ColumnC

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;
}

我也不知道返回类型。

换句话说,

如何从中获取linq查询:

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

from table 

group by(Month(date))

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

提前致谢

2 个答案:

答案 0 :(得分:0)

此处的返回类型部分为 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;
}

答案 1 :(得分:0)

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

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>>,这很容易使用。

在这两种情况下,Key都是Month,Value是ColumnC的总和