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

以上有什么不对吗?这似乎是有效的,但我当然愿意接受更好的解决方案。

Linq groupBy, Sum and orderBy

查询任何年份只是您的性别组中的另一个子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),
            }};