我有以下DataTable:
DataTable itemsOnSkid = new DataTable();
itemsOnSkid.Columns.Add("ItemNumber");
itemsOnSkid.Columns.Add("Qty");
我需要按itemnumber聚合这个数据表。我正在使用以下linq代码:
var result = from row in itemsOnSkid.AsEnumerable()
group row by row.Field<string>("ItemNumber") into grp
select new
{
ItemNumber = grp.Key,
Qty = grp.Sum(r => r.Field<int>("Qty"))
};
问题是我需要用这个结果替换第一个数据表,但是我无法在结果上使用.CopyToDataTable()
。
如何将此结果转换回数据表?
答案 0 :(得分:1)
在这种情况下,你不能使用CopyToDataTable(),因为你要复制的东西必须是DataRow。我认为你已经被卡住了。
DataTable items = new DataTable();
items.Columns.Add("number");
items.Columns.Add("qty");
var result = from r in items.AsEnumerable()
group r by r.Field<string>("number") into grp
select new {
number = grp.Key,
qty = grp.Sum(r => r.Field<int>("qty"))
};
DataTable newItems = new DataTable();
newItems.Columns.Add("number");
newItems.Columns.Add("qty");
foreach (var item in result) {
DataRow newRow = newItems.NewRow();
newRow["number"] = item.number;
newRow["qty"] = item.qty;
newItems.AddRow(newRow);
}
答案 1 :(得分:0)
我尝试了与TFischer相同的快速,但直接使用DataRow。没有额外的对象。
这是我的代码:
private static void Main(string[] args)
{
var itemsOnSkid = CreateDataTable();
FillData(itemsOnSkid);
var result = itemsOnSkid.AsEnumerable().GroupBy(row => row.Field<string>("ItemNumber")).Select(
grp =>
{
var newRow = itemsOnSkid.NewRow();
newRow["ItemNumber"] = grp.Key;
newRow["Qty"] = grp.Sum(r => r.Field<int>("Qty"));
return newRow;
}).CopyToDataTable();
}
private static DataTable CreateDataTable()
{
var itemsOnSkid = new DataTable();
itemsOnSkid.Columns.Add("ItemNumber");
itemsOnSkid.Columns.Add("Qty", typeof(int));
return itemsOnSkid;
}
// Fill some Data in the Table
private static void FillData(DataTable itemsOnSkid)
{
for (int i = 1; i <= 10; i++)
{
var newRow = itemsOnSkid.NewRow();
newRow["ItemNumber"] = i % 3;
newRow["Qty"] = i;
itemsOnSkid.Rows.Add(newRow);
}
}
我希望它有所帮助。
答案 2 :(得分:0)
var query = from empl in te.Employees.AsEnumerable() select empl;
List<Employee> dt = query.ToList();
gdempdetails.DataSource = dt;
gdempdetails.DataBind();