Asp.net 按年份对linq数据求和

Asp.net 按年份对linq数据求和,asp.net,asp.net-mvc,linq,Asp.net,Asp.net Mvc,Linq,我见过几十篇类似的帖子,但我就是无法让它发挥作用 使用asp.NETMVC框架,我有一个名为Contributions的表,其中包含一个“ContributionDate”列和一个“Amount”列。我正在加载要在图表中显示的日期和金额: var results = db.Contributions.Where(c => c.Amount > 0); ArrayList xValue = new ArrayList(); ArrayList yValue = new ArrayLi

我见过几十篇类似的帖子,但我就是无法让它发挥作用

使用asp.NETMVC框架,我有一个名为Contributions的表,其中包含一个“ContributionDate”列和一个“Amount”列。我正在加载要在图表中显示的日期和金额:

var results = db.Contributions.Where(c => c.Amount > 0);

ArrayList xValue = new ArrayList();
ArrayList yValue = new ArrayList();

results.ToList().ForEach(c => xValue.Add(c.ContributionDate));
results.ToList().ForEach(c => yValue.Add(c.Amount));
以上工作。现在我想对每年的金额进行合计。我看到过与下面类似的示例,但我显然不清楚(在这个示例中,编译器不喜欢新{}语句中的“c.ContributionDate”):


谢谢你的帮助

执行
GroupBy
时,用于对元素进行分组的键由属性表示

试试这个:

var results = db.Contributions
    .Where(c => c.Amount > 0)
    .GroupBy( c => c.ContributionDate )
    .Select(c => new { Amount = c.Sum(b => b.Amount), Date = c.Key });
但这将按整个
贡献日期
值对项目进行分组,而不仅仅是按年份。要做到这一点,你必须这样做:

var results = db.Contributions
    .Where(c => c.Amount > 0)
    .GroupBy( c => c.ContributionDate.Year)
    .Select(c => new 
    { 
        Amount = c.Sum(b => b.Amount), 
        Date = new DateTime(c.Key, 1, 1) 
    });
但由于这似乎是实体框架,您可能需要使用以下功能:

using System.Data.Entity;

...

var results = db.Contributions
    .Where(c => c.Amount > 0)
    .GroupBy( c => c.ContributionDate.Year)
    .Select(c => new 
    { 
        Amount = c.Sum(b => b.Amount), 
        Date = EntityFunctions.CreateDateTime(c.Key, 1, 1, 0, 0, 0) 
    });

您应该考虑使用泛型<代码>列表>代码>类,而不是过时的<代码> ARARYLISTAB/COM>。哇!好极了谢谢我在这上面花了很多新手时间。FWIW,第二个示例导致了“LINQtoEntities中只支持无参数构造函数”错误,但我只是在第一个示例中的贡献日期中添加了“.Year”,它起了作用。谢谢,谢谢。@SteveA如果您的查询按原样工作,我假设
ContributionDate
已经只有年份部分了,我会选择第一个解决方案。但请参阅我的更新答案,了解在Linq-to-Entities中工作的解决方案。谢谢pswg。您的第一个查询起作用了,但由于ContributionDate是DateTime,因此我需要添加.Year(如我在第一条评论中提到的)。效果很好。
using System.Data.Entity;

...

var results = db.Contributions
    .Where(c => c.Amount > 0)
    .GroupBy( c => c.ContributionDate.Year)
    .Select(c => new 
    { 
        Amount = c.Sum(b => b.Amount), 
        Date = EntityFunctions.CreateDateTime(c.Key, 1, 1, 0, 0, 0) 
    });