Linq groupBy, Sum and orderBy
本文关键字:and orderBy Sum groupBy Linq | 更新日期: 2023-09-27 18:09:08
还在学习Linq。所以我有一个类,看起来像这样(来自一个数据库表):
class FundRaisingData
{
public double funds { get; set; }
public DateTime date { get; set; }
public string agentsGender { get; set; }
}
我需要做的是将其转换为看起来像这样的匿名对象列表(稍后将转换并返回JSON)。我知道这不是一个匿名对象,但它会让你对我要做的事情有一些了解:
class groupedFunds
{
public string gender { get; set; }
public List<double> fundsRaised { get; set; }
}
所以我需要弄清楚如何以正确的顺序将每年的资金加起来(2010-2014)。
最终在JSON中应该是这样的:ListOfGroupedFunds[
{
"gender" : "Female",
"fundsRaised" : [2000, 2500, 3000]
},
{
"gender" : "Male",
"fundsRaised": [4300,2300,3100]
}
];
所以fundsRaised[0]对应于2012,fundsRaised[1]对应于2013,等等,但实际上在对象的任何地方都没有说"2013"。
我今天读了很多关于Linq的文章,并在StackOverflow上搜索了类似的文章,但我仍然不能完全弄清楚。如果你能给我指出正确的方向,那就太好了。
—编辑2(修改代码更接近解决方案)—
我认为Mike的代码工作得很好,但因为我不确定会提前多少年,所以我稍微修改了一下:
var results = data.GroupBy(g=> Gender = g.agentsGender)
.Select(g=> new
{
gender = g.Key
years = g.GroupBy(y=> y.Date.Year)
.OrderBy(y=> y.Key)
.Select(y=> y.Sum(z=> z.funds))
.ToArray()
})
.ToArray();
以上有什么不对吗?这似乎是有效的,但我当然愿意接受更好的解决方案。
查询任何年份只是您的性别组中的另一个子GroupBy()
。
var results = data.GroupBy(g=> Gender = g.agentsGender)
.Select(g=> new
{
gender = g.Key
years = g.GroupBy(y=> y.Date.Year)
.OrderBy(y=> y.Key)
.Select(y=> y.Sum(y.funds))
.ToArray()
})
.ToArray();
LINQ语句将按性别分组,然后将每年的资金总额作为List。
var query = from d in data
group d by d.agentsGender into g
select new { gender = g.Key, fundsRaised = new List<double> {
g.Where(f => f.date.Year == 2012).Sum(f => f.funds),
g.Where(f => f.date.Year == 2013).Sum(f => f.funds),
g.Where(f => f.date.Year == 2014).Sum(f => f.funds),
}};