Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq_Datetime - Fatal编程技术网

C#Linq数据表按日期时间月分组

C#Linq数据表按日期时间月分组,c#,linq,datetime,C#,Linq,Datetime,我有一个看起来像这样的数据表 我试图实现的输出如图所示,我想按datetime的月份进行分组,我想是代理。这就是我目前所拥有的 DataTable dtTemp = new DataTable(); dtTemp.Columns.Add("Agent", typeof(string)); dtTemp.Columns.Add("Amount", typeof(decimal)); dtTemp.Co

我有一个看起来像这样的数据表

我试图实现的输出如图所示,我想按datetime的月份进行分组,我想是代理。这就是我目前所拥有的

            DataTable dtTemp = new DataTable();
            dtTemp.Columns.Add("Agent", typeof(string));
            dtTemp.Columns.Add("Amount", typeof(decimal));
            dtTemp.Columns.Add("Date", typeof(DateTime));

            dtTemp = dtTemp.AsEnumerable()
           .GroupBy(r => r[0])
           .Select(g =>
           {
               var row = dt.NewRow();

               row[0] = g.Key;
               row[1] = g.Sum(r => (decimal)r[1]);

               return row;
           })
           .CopyToDataTable();
有什么办法可以做到这一点吗

提前谢谢

var temp = dtTemp.AsEnumerable().GroupBy(grp => new { grpmonth = Convert.ToDateTime(grp["Date"]).Month, grpyear = Convert.ToDateTime(grp["Date"]).Year, grpagent = grp["Agent"] })
                                 .Select(val =>
                                     {
                                         var row = dtTemp.NewRow();

                                         row["Agent"] = val.FirstOrDefault()["Agent"];
                                         row["Amount"] = val.Sum(amt => Convert.ToDecimal(amt["Amount"]));
                                         row["Date"] = val.FirstOrDefault()["Date"];
                                         return row;
                                     }
                                     )
                                 .CopyToDataTable();

对于

所以从您的输入序列中,您需要所有使用的
代理
,以及每个月的
金额的总和

假设DataTable是一个行序列,并且可以轻松地转换为一个行序列:

class RowData
{
    public string Agent {get; set}
    public DateTime Date {get; set;}
    public int Amount {get; set;}
}

IEnumerable<RowData> tableData = ...

在分析帖子时,您需要按列
Agent
按数据表行分组,并且只需从列
Date
开始的月份和年份分组

您需要获取一个临时数据表
dt
,它可以保存结果数据表
result
中每列的数据类型

因此,
CopyToDataTable()
将把所有
dtTemp
组数据复制到新的
结果
数据表中,其中包含临时
dt
列数据类型

DataTable dt = new DataTable();
dt.Columns.Add("Agent", typeof(string));
dt.Columns.Add("Amount", typeof(decimal));
dt.Columns.Add("Date", typeof(string));


DataTable result = dtTemp.AsEnumerable()
     .Select(x => new
     {
         Agent = x.Field<string>("Agent"),
         Amount = x.Field<decimal>("Amount"),
         Date = x.Field<DateTime>("Date").ToString("MM-yyyy")
     })
     .GroupBy(x => new { x.Agent, x.Date })
     .Select(g =>
     {
         var r = dt.NewRow();

         r["Agent"] = g.Key.Agent;
         r["Amount"] = g.Sum(c => c.Amount);
         r["Date"] = g.FirstOrDefault().Date;

         return r;
     })
     .CopyToDataTable();
DataTable dt=newdatatable();
添加(“代理”,类型(字符串));
dt.列。添加(“金额”,类型(十进制));
添加(“日期”,类型(字符串));
DataTable结果=dtTemp.AsEnumerable()
.选择(x=>new
{
代理=x.字段(“代理”),
金额=x.字段(“金额”),
日期=x.字段(“日期”).ToString(“MM yyyy”)
})
.GroupBy(x=>new{x.Agent,x.Date})
.选择(g=>
{
var r=dt.NewRow();
r[“代理”]=g.Key.Agent;
r[“金额”]=g.总和(c=>c.金额);
r[“日期”]=g.FirstOrDefault().Date;
返回r;
})
.CopyToDataTable();
输出:

.GroupBy(r=>new{agent=r[0],month=new DateTime(r[2]。Year,r[2]。month,1)})
DataTable dt = new DataTable();
dt.Columns.Add("Agent", typeof(string));
dt.Columns.Add("Amount", typeof(decimal));
dt.Columns.Add("Date", typeof(string));


DataTable result = dtTemp.AsEnumerable()
     .Select(x => new
     {
         Agent = x.Field<string>("Agent"),
         Amount = x.Field<decimal>("Amount"),
         Date = x.Field<DateTime>("Date").ToString("MM-yyyy")
     })
     .GroupBy(x => new { x.Agent, x.Date })
     .Select(g =>
     {
         var r = dt.NewRow();

         r["Agent"] = g.Key.Agent;
         r["Amount"] = g.Sum(c => c.Amount);
         r["Date"] = g.FirstOrDefault().Date;

         return r;
     })
     .CopyToDataTable();