我有一个数据库表,如下所示:
sudoers
基本上我想要实现的是这个。我正在尝试编写一个linq查询,我可以在一个月内对每条记录进行分组。然后总结列 Amount 的所有值,并将其存储在相应的月份组中。
如上面的示例表所示,Sums将如下所示:
然后,这些相关的总和将显示在条形图中。
我想我需要做一些分组,并使用一些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 |`
`
答案 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月的记录,该怎么办?你想把它们混合在一起吗?也许您需要在分组数据时更改某些条件。