C#Linq数据表按日期时间月分组
我有一个看起来像这样的数据表 我试图实现的输出如图所示,我想按datetime的月份进行分组,我想是代理。这就是我目前所拥有的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
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();