linq 对datatable 分组
场景:C# Linq对DataTable分组求和解决思路
C# Linq对DataTable分组求和
以下是代码:
DataTable myDT = new DataTable();
myDT.Columns.Add(new DataColumn("PM", typeof(string))); //单据编号
myDT.Columns.Add(new DataColumn("BH", typeof(string))); //编号
myDT.Columns.Add(new DataColumn("DH", typeof(string))); //工单号
myDT.Columns.Add(new DataColumn("SL",typeof(decimal))); //数量
DataRow myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0001";
myRow["DH"] = "130701001";
myRow["SL"] = 100;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0002";
myRow["DH"] = "130701001";
myRow["SL"] = 120;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0003";
myRow["DH"] = "130701002";
myRow["SL"] = 120;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0004";
myRow["DH"] = "130701002";
myRow["SL"] = 200;
myDT.Rows.Add(myRow);
var myTable = from t in myDT.AsEnumerable()
group t by new { myDH = t.Field<string>("DH") } into x
select new
{
x.Key.myDH,
y = x.Sum(k => k.Field<decimal>("SL"))
};
foreach (var s in myTable)
{
MessageBox.Show(s.myDH.ToString() + ':' + s.y.ToString());
}
对单号进行分组,对数量求和,要达到下面这种样式:
单据编号 工单号 数量
M0120130700010001,M0120130700010002 130701001 220
M0120130700010003,M0120130700010004 130701002 320
------解决方案--------------------
参考http://bbs.****.net/topics/380267995
------解决方案--------------------
select new {
单据编号 = string.Join(",", x.Select(y => y.Field<string>("PM")),
工单号 = x.Key,
数量 = x.Select(y => y.Field<decimal>("SL").Sum()
}
C# Linq对DataTable分组求和
以下是代码:
DataTable myDT = new DataTable();
myDT.Columns.Add(new DataColumn("PM", typeof(string))); //单据编号
myDT.Columns.Add(new DataColumn("BH", typeof(string))); //编号
myDT.Columns.Add(new DataColumn("DH", typeof(string))); //工单号
myDT.Columns.Add(new DataColumn("SL",typeof(decimal))); //数量
DataRow myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0001";
myRow["DH"] = "130701001";
myRow["SL"] = 100;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0002";
myRow["DH"] = "130701001";
myRow["SL"] = 120;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0003";
myRow["DH"] = "130701002";
myRow["SL"] = 120;
myDT.Rows.Add(myRow);
myRow = myDT.NewRow();
myRow["PM"] = "M012013070001";
myRow["BH"] = "0004";
myRow["DH"] = "130701002";
myRow["SL"] = 200;
myDT.Rows.Add(myRow);
var myTable = from t in myDT.AsEnumerable()
group t by new { myDH = t.Field<string>("DH") } into x
select new
{
x.Key.myDH,
y = x.Sum(k => k.Field<decimal>("SL"))
};
foreach (var s in myTable)
{
MessageBox.Show(s.myDH.ToString() + ':' + s.y.ToString());
}
对单号进行分组,对数量求和,要达到下面这种样式:
单据编号 工单号 数量
M0120130700010001,M0120130700010002 130701001 220
M0120130700010003,M0120130700010004 130701002 320
C#
LINQ
------解决方案--------------------
参考http://bbs.****.net/topics/380267995
------解决方案--------------------
select new {
单据编号 = string.Join(",", x.Select(y => y.Field<string>("PM")),
工单号 = x.Key,
数量 = x.Select(y => y.Field<decimal>("SL").Sum()
}