如何将linq结果转换为DataTable

时间:2014-07-29 17:45:13

标签: c# linq

我有以下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()

如何将此结果转换回数据表?

3 个答案:

答案 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();