我在LINQ周围度过了最艰难的时光。 我正在查询数据库
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))
==============
提前致谢
答案 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的总和