一、需求背景
通过Data Table创建多个行,根据Material进行Group By分组,对Qty进行求和运算.
原始数据
Material | TotalQTY | Qty |
---|---|---|
A | 10 | 1 |
B | 20 | 1 |
B | 20 | 2 |
A | 10 | 3 |
要获得的数据
Material | TotalQTY | Qty |
---|---|---|
A | 10 | 4 |
B | 20 | 3 |
实际上要执行该SQL语句:
select Material ,TotalQTY,sum(Qty) from tableName group by Material ,TotalQTY ;
由于该表是有前台创建的,DB中没有该表信息所以不能使用SQL语句,我采用的Linq语句实现的对Material ,TotalQTY的分组求和。
二、使用DataTable创建表及数据
//1、新建表
private DataTable dtResult = new DataTable();
//2、表中添加列
dtResult.Columns.Add("Material", typeof(string));
dtResult.Columns.Add("TotalQTY", Type.GetType("System.Decimal"));
dtResult.Columns.Add("QTY", Type.GetType("System.Decimal"));
//3、初始化行并添加数据
DataRow row = dtResult.NewRow();
row["Material"] = "Material_A";
row["TotalQTY"] = "100";
row["QTY"] = "5";
//4、表中添加行
dtResult.Rows.Add(row);
三、GroupBy对数据分组求和
采用Linq语句对数据进行分组,通过创建新的DataTable达到分组求和的目的。
DataTable dtGroupBy = dtResult.AsEnumerable().GroupBy(r => new { Material= r["Material"], TotalQTY= r["TotalQTY"]}).Select(
g =>{
var row = dtResult.NewRow();
row["Material"] = g.Key.Material;
row["TotalQTY"] = g.Key.TotalQTY;
row["QTY"] = g.Sum(r => (decimal)r["QTY"]);
return row;
}).CopyToDataTable();
dtGroupBy就是要获得的数据
Material | TotalQTY | Qty |
A | 10 | 4 |
B | 20 | 3 |