Linq groupBy,Sum and orderBy

时间:2014-06-17 23:04:34

标签: c# json linq sum

还在这里学习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();

以上是否有任何不妥之处?它似乎有效,但我当然愿意接受更好的解决方案。

2 个答案:

答案 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();