C# 创建包含总计的按月数据表

C# 创建包含总计的按月数据表,c#,linq,C#,Linq,我有两个数据库表,在下面的FK(ResponseHeader)示例中连接(示例中的日期是10月6日) 负责人 ResponseHeaderId DateTime 0e24cf96-81eb-2122-7e4a-0d200474692f 06/10/2018 11:15:59 响应数据 ResponseDataId ResponseHeaderId

我有两个数据库表,在下面的FK(ResponseHeader)示例中连接(示例中的日期是10月6日)

负责人

ResponseHeaderId                        DateTime
0e24cf96-81eb-2122-7e4a-0d200474692f    06/10/2018 11:15:59
响应数据

ResponseDataId                          ResponseHeaderId                        Response
41c831f1-0adc-2bd5-053e-00406fa526b6    0e24cf96-81eb-2122-7e4a-0d200474692f    1   
78967068-82a6-4098-ba35-03211a923f46    0e24cf96-81eb-2122-7e4a-0d200474692f    2
854bc8a6-5877-a6fb-9072-00e358323350    0e24cf96-81eb-2122-7e4a-0d200474692f    2   
fe2a667d-ca0e-49a6-b330-f4d4232bfe89    0e24cf96-81eb-2122-7e4a-0d200474692f    3
30f0270e-3e69-3408-7add-02a85f4b9aeb    0e24cf96-81eb-2122-7e4a-0d200474692f    1
有多个响应标头,每个响应标头有5行数据(每个)

需要将每组响应数据的响应相加(示例=9)

但我想要实现的是这样一个表,其中所有内容都是在给定年份内按月合计的

2018
Month        Responses        Sum
October      1                9
但是,由于每个响应负责人都有多行,因此我最终想要的是:

2018
Month        Responses        Sum
October      185              234
September    564              985
...
2017
Month        Responses        Sum
January      54               123
...
我有linq用于按月求和,例如:

var total = 0;
var filteredResponses = Model.SurveyResponseHeader.Where(x => x.StartDate > DateTime.Today.LastMonth() && x.StartDate > DateTime.Today.AddMonths(1).LastMonth()).ToList();

foreach (var response in filteredResponses)
{
    var responseTotal = (response.SurveyResponses.Sum(x => x.Response));
    total += responseTotal;
}

@total
考虑到这一切,我该怎么办

  • 按月循环遍历数据,对当月的每个响应数据集求和
  • 按月份和年份对数据进行分组
我对一些基本的linq和C(用于按日期查询数据和求和)没有问题,但是像这样分组和求和有点超出我的理解

请尝试以下代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt1 = new DataTable();

            dt1.Columns.Add("ResponseHeaderId", typeof (string));
            dt1.Columns.Add("DateTime", typeof (DateTime));

            dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d200474692f", DateTime.Parse("06/10/2018 11:15:59") });
            dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746930", DateTime.Parse("05/10/2018 11:15:59") });
            dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746931", DateTime.Parse("04/10/2018 11:15:59") });
            dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746932", DateTime.Parse("03/10/2017 11:15:59") });
            dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746933", DateTime.Parse("02/10/2017 11:15:59") });

            DataTable dt2 = new DataTable();

            dt2.Columns.Add("ResponseDataId", typeof (string));
            dt2.Columns.Add("ResponseHeaderId", typeof (string));
            dt2.Columns.Add("Response", typeof (int));


            dt2.Rows.Add(new object[] { "41c831f1-0adc-2bd5-053e-00406fa526b6","0e24cf96-81eb-2122-7e4a-0d200474692f", 1 });  
            dt2.Rows.Add(new object[] { "78967068-82a6-4098-ba35-03211a923f46","0e24cf96-81eb-2122-7e4a-0d200474692f", 2 });
            dt2.Rows.Add(new object[] { "854bc8a6-5877-a6fb-9072-00e358323350","0e24cf96-81eb-2122-7e4a-0d2004746930", 2 });
            dt2.Rows.Add(new object[] { "fe2a667d-ca0e-49a6-b330-f4d4232bfe89","0e24cf96-81eb-2122-7e4a-0d2004746931", 3 });
            dt2.Rows.Add(new object[] { "30f0270e-3e69-3408-7add-02a85f4b9aeb","0e24cf96-81eb-2122-7e4a-0d2004746932", 1 });
            dt2.Rows.Add(new object[] { "30f0270e-3e69-3408-7add-02a85f4b9aeb","0e24cf96-81eb-2122-7e4a-0d2004746933", 1 });


            var join = (from d1 in dt1.AsEnumerable()
                        join d2 in dt2.AsEnumerable() on d1.Field<string>("ResponseHeaderId") equals d2.Field<string>("ResponseHeaderId")
                        select new { d1 = d1, d2 = d2 })
                        .OrderByDescending(x => x.d1.Field<DateTime>("DateTime"))
                       .GroupBy(x => new { year = x.d1.Field<DateTime>("DateTime").Year, month = x.d1.Field<DateTime>("DateTime").ToString("MMMM") })
                       .Select(x => new { year = x.Key.year, month = x.Key.month, total = x.Select(y => y.d2.Field<int>("Response")).Sum()})
                       .ToList();
        }
    }



}
使用系统;
使用System.Collections.Generic;
使用系统集合;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt1=新DataTable();
dt1.Columns.Add(“ResponseHeaderId”,typeof(string));
dt1.Columns.Add(“DateTime”,typeof(DateTime));
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d200474692f”,DateTime.Parse(“06/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746930”,DateTime.Parse(“05/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746931”,DateTime.Parse(“04/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746932”,DateTime.Parse(“03/10/2017 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746933”,DateTime.Parse(“02/10/2017 11:15:59”);
DataTable dt2=新的DataTable();
dt2.Columns.Add(“ResponseDataId”,typeof(string));
dt2.Columns.Add(“ResponseHeaderId”,typeof(string));
dt2.Columns.Add(“响应”,typeof(int));
添加(新对象[]{“41c831f1-0adc-2bd5-053e-00406fa526b6”,“0e24cf96-81eb-2122-7e4a-0d200474692f”,1});
添加(新对象[]{“78967068-82a6-4098-ba35-03211a923f46”,“0e24cf96-81eb-2122-7e4a-0d200474692f”,2});
添加(新对象[]{“854bc8a6-5877-a6fb-9072-00e358323350”,“0e24cf96-81eb-2122-7e4a-0d2004746930”,2});
添加(新对象[]{“fe2a667d-ca0e-49a6-b330-f4d4232bfe89”,“0e24cf96-81eb-2122-7e4a-0d2004746931”,3});
dt2.Rows.Add(新对象[]{“30f0270e-3e69-3408-7add-02a85f4b9aeb”,“0e24cf96-81eb-2122-7e4a-0d2004746932”,1});
dt2.Rows.Add(新对象[]{“30f0270e-3e69-3408-7add-02a85f4b9aeb”,“0e24cf96-81eb-2122-7e4a-0d2004746933”,1});
var join=(从dt1.AsEnumerable()中的d1开始)
在d1.Field(“ResponseHeaderId”)上的dt2.AsEnumerable()中加入d2等于d2.Field(“ResponseHeaderId”)
选择新的{d1=d1,d2=d2})
.OrderByDescending(x=>x.d1.Field(“日期时间”))
.GroupBy(x=>new{year=x.d1.Field(“DateTime”).year,month=x.d1.Field(“DateTime”).ToString(“MMMM”)})
.Select(x=>new{year=x.Key.year,month=x.Key.month,total=x.Select(y=>y.d2.Field(“Response”)).Sum())
.ToList();
}
}
}

我不确定这里的实际问题是什么。你说得很好,我实际上没有说。。。我不知道如何编写代码来生成这个输出。我试过了,但我解不出来。你的问题似乎太宽泛了。你能把注意力集中到你遇到麻烦的一个方面吗?例如,“我如何循环几个月?”或“我如何创建列?”非常感谢@jdweng对我的模型进行了一些调整,我已经得到了我所需要的。