还在这里学习Linq。所以我有一个看起来像这样的类(来自db表):
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年等,但实际上并没有说&#34; 2013&#34;在对象的任何地方。
我今天在Linq上阅读了大量文章,并通过类似的StackOverflow文章进行了搜索,但我仍然无法弄明白。任何帮助我指向正确方向的帮助都会很棒。
- 编辑2(更改代码更接近匹配解决方案) -
我认为迈克的代码运作良好,但因为我不确定提前多少年我会稍微修改一下:
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();
以上是否有任何不妥之处?它似乎有效,但我当然愿意接受更好的解决方案。
答案 0 :(得分:1)
Thins LINQ语句将按性别分组,然后将每年的资金总额作为列表。
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),
}};
答案 1 :(得分:1)
查询任意年份只是您性别群体中的另一个子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();