使用linq聚合和分解数据

时间:2017-06-25 18:39:35

标签: c# asp.net-mvc linq

我有一个数据库表,如下所示:

sudoers

基本上我想要实现的是这个。我正在尝试编写一个linq查询,我可以在一个月内对每条记录进行分组。然后总结列 Amount 的所有值,并将其存储在相应的月份组中。

如上面的示例表所示,Sums将如下所示:

  • 1月= 350
  • 二月= 400

然后,这些相关的总和将显示在条形图中。

我想我需要做一些分组,并使用一些foreach-magic进一步扩展。但我现在对于如何实现这一目标一无所知。

任何能够指出我正确方向的建议都将受到高度赞赏。

修改

jdweng的linq查询让我走上正轨。

虽然它远非最佳,但下面的代码是我解决它的方式。任何有关改进的提示都是受欢迎的。

| ID | Label | Type | Amount | Category | OriginDate |
------------------------------------------------------
| 1  | Foo   | 1    | 100    | 8        | 2017-01-23 |
| 2  | Bar   | 2    | 250    | 1        | 2017-01-30 |`
| 3  | Foo   | 1    | 400    | 12       | 2017-02-15 |`

`

2 个答案:

答案 0 :(得分:0)

请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Label", typeof(string));
            dt.Columns.Add("Type", typeof(int));
            dt.Columns.Add("Amount", typeof(int));
            dt.Columns.Add("Category", typeof(int));
            dt.Columns.Add("OriginDate", typeof(DateTime));


            dt.Rows.Add(new object[] { 1,"Foo",1,100,8, DateTime.Parse("2017-01-23")});
            dt.Rows.Add(new object[] { 2,"Bar",2,250,1, DateTime.Parse("2017-01-30")});
            dt.Rows.Add(new object[] { 3,"Foo",1,400,12, DateTime.Parse("2017-02-15")});

            var results = dt.AsEnumerable().GroupBy(x => new { month = x.Field<DateTime>("OriginDate").Month, year = x.Field<DateTime>("OriginDate").Year }).Select(x => new {
                month = x.Key.month,
                year = x.Key.year,
                amount = x.Select(y => y.Field<int>("Amount")).Sum()
            }).ToList();

        }
    }
}

答案 1 :(得分:0)

您可能会以某种形式IEnumerable<T>保留您的数据。然后,您可以轻松使用GroupBy(甚至ToDictionary)并按OriginDate.Month对数据进行分组。最后你需要Sum(),或者你可以在每个月存储的记录上写一个循环。

但是,您需要注意其他情况,例如:如果您有2016年1月和2017年1月的记录,该怎么办?你想把它们混合在一起吗?也许您需要在分组数据时更改某些条件。