C# 使用linq聚合和分解数据
我有一个如下所示的数据库表:C# 使用linq聚合和分解数据,c#,asp.net-mvc,linq,C#,Asp.net Mvc,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 |
| 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 |`
基本上我想要达到的就是这个。我正在尝试编写一个linq查询,在那里我可以在一个月内对每条记录进行分组。然后将列Amount的所有值相加,并将其存储在对应的月份组中
鉴于上面的示例表,总和如下所示:
- 一月=350
- 二月=400
public ExpensesByMonth ChartMonthlyExpenses()
{
// Retreives all transactions from repository
List<Transaction> allTransactions = _repository.SelectAllTransactions();
// Filter transactions by transaction type (2 = expenses)
var filteredTransactions = (from transactions in allTransactions
where transactions.Type == 2
select transactions);
// Made some modifications to jdweng's query in order to adapt it to existing codebase
var results = filteredTransactions.GroupBy(x => new { month = x.OriginDate.Month, year = x.OriginDate.Year }).Select(x => new {
month = x.Key.month,
year = x.Key.year,
amount = x.Select(y => y.Amount).Sum()
}).ToList();
// Instantiating a new object containing all month's expenses as properties
ExpensesByMonth expenseObj = new ExpensesByMonth();
// Looping through each result and assigning the amounts to a certain property, using a switch statement
foreach(var result in results)
{
switch (result.month)
{
case 1:
expenseObj.JanuaryExpenses = result.amount;
break;
case 2:
expenseObj.FebruaryExpenses = result.amount;
break;
case 3:
expenseObj.MarchExpenses = result.amount;
break;
case 4:
expenseObj.AprilExpenses = result.amount;
break;
case 5:
expenseObj.MayExpenses = result.amount;
break;
case 6:
expenseObj.JuneExpenses = result.amount;
break;
case 7:
expenseObj.JulyExpenses = result.amount;
break;
case 8:
expenseObj.AugustExpenses = result.amount;
break;
case 9:
expenseObj.SeptemberExpenses = result.amount;
break;
case 10:
expenseObj.OctoberExpenses = result.amount;
break;
case 11:
expenseObj.NovemberExpenses = result.amount;
break;
case 12:
expenseObj.DecemberExpenses = result.amount;
break;
}
}
return expenseObj;
}
公共支出月月支出()
{
//从存储库检索所有事务
列出所有事务=_存储库。选择allTransactions();
//按交易类型筛选交易记录(2=费用)
var filteredTransactions=(来自所有事务中的事务
其中transactions.Type==2
选择交易);
//对jdweng的查询进行了一些修改,以使其适应现有的代码库
var results=filteredTransactions.GroupBy(x=>new{month=x.OriginDate.month,year=x.OriginDate.year})。选择(x=>new{
月份=x.Key.month,
年份=x.Key.year,
amount=x.Select(y=>y.amount).Sum()
}).ToList();
//实例化一个新对象,其中包含作为属性的所有月费用
ExpensesByMonth expenseObj=新的ExpensesByMonth();
//使用switch语句循环遍历每个结果并将数量分配给某个属性
foreach(结果中的var结果)
{
开关(结果月)
{
案例1:
expenseObj.1月费用=结果.金额;
打破
案例2:
expenseObj.February费用=结果.金额;
打破
案例3:
expenseObj.MarcheExpenses=结果.amount;
打破
案例4:
expenseObj.AprilExpenses=结果.amount;
打破
案例5:
expenseObj.MayExpenses=结果.金额;
打破
案例6:
expenseObj.JuneExpenses=结果.amount;
打破
案例7:
expenseObj.JulyExpenses=结果.amount;
打破
案例8:
expenseObj.AugusteExpenses=结果.amount;
打破
案例9:
expenseObj.SeptemberExpenses=result.amount;
打破
案例10:
expenseObj.OctoberExpenses=结果.amount;
打破
案例11:
expenseObj.NovenmberExpenses=结果.金额;
打破
案例12:
expenseObj.DecemberExpenses=结果.金额;
打破
}
}
返回费用对象;
}
`尝试以下操作:
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();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“ID”,typeof(int));
添加(“标签”,类型(字符串));
添加(“类型”,类型(int));
dt.列。添加(“金额”,类型(int));
添加(“类别”,类型(int));
添加(“OriginDate”,typeof(DateTime));
Add(新对象[]{1,“Foo”,1100,8,DateTime.Parse(“2017-01-23”)});
Add(新对象[]{2,“Bar”,2250,1,DateTime.Parse(“2017-01-30”)});
Add(新对象[]{3,“Foo”,1400,12,DateTime.Parse(“2017-02-15”)});
var results=dt.AsEnumerable().GroupBy(x=>new{month=x.Field(“OriginDate”).month,year=x.Field(“OriginDate”).year}。选择(x=>new{
月份=x.Key.month,
年份=x.Key.year,
金额=x.选择(y=>y.字段(“金额”).Sum()
}).ToList();
}
}
}
您可能会将数据保存为某种形式的IEnumerable
。然后,您可以方便地使用(甚至)按OriginDate.Month
对数据进行分组。最后,您将需要在某个时刻,或者您可以在每个月存储的记录上写一个循环
但是,您需要注意其他情况,例如:如果您有2016年1月和2017年1月的记录,该怎么办?你想把它们混在一起吗?在对数据进行分组时,可能需要更改某些条件。请添加问题描述,并提供重现问题所需的详细信息和最少代码。您可以开始在SQL中查看此解决方案来对日期进行分组:类似的操作应该可以做到:
Entity.GroupBy(e=>e.OriginDate.Month)。选择(g=>g.Su)