Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq聚合和分解数据_C#_Asp.net Mvc_Linq - Fatal编程技术网

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
然后,这些相关金额将显示在条形图中

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

任何能为我指明正确方向的建议都将不胜感激

编辑:

jdweng的linq查询让我走上了正确的轨道

虽然这远远不是最优的,下面的代码是我如何解决它的。任何关于改进的建议都是最受欢迎的

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)