1

我使用 C# 开发了一个 Windows 应用程序。使用 DataTable 列出所有信息。该数据表具有重复值。

我的结果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney                                1                
Richard James Whitaker            1             
Richard James Whitaker            1             
Richard James Whitaker            1             
Richard James Whitaker            1             
Wayne Dunne              1              
Wayne Dunne              1              
Richard James Whitaker            1             
Wayne Dunne              1              
Richard James Whitaker            1             
Richard James Whitaker            1             

预期结果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney                                1                
Richard James Whitaker            7             
Wayne Dunne              3              

我需要一个 linq 查询来达到预期的结果。

请帮助我得到这个。提前致谢。

4

2 回答 2

2
from r in table.AsEnumerable()
group r by r.Field<string>("Lead Owners") into g
select new {
   LeadOwners = g.Key,
   2Days = g.Sum(r => r.Field<int?>("2Days")),
   5Days = g.Sum(r => r.Field<int?>("5Days"))
   // etc
}

您可以使用 CopyToDataTable 方法从查询结果创建新的 DataTable,如果您确实需要它是 DataTable:从查询创建 DataTable

于 2013-11-07T11:43:53.267 回答
2

如果要创建一个DataTable包含聚合值的新值,LINQ 并不是完成整个任务的最佳工具。您应该使用DataTable.Clone创建具有相同架构的空表。

然后可以Enumerable.GroupBy在源表的键列上使用。最后使用循环将DataRows 与聚合值相加:

var ownerGroups = dt.AsEnumerable()
    .GroupBy(row => row.Field<string>("Lead Owners"));
var dt2 = dt.Clone();
var intColumns = dt2.Columns.Cast<DataColumn>()
    .Where(c => c.DataType == typeof(int)).ToArray();
foreach (var grp in ownerGroups)
{
    var row = dt2.Rows.Add();
    row.SetField("Lead Owners", grp.Key);
    foreach (DataColumn col in intColumns)
    {
        bool anyNonNull = grp.Any(r => r.Field<int?>(col.Ordinal).HasValue);
        int? sum = anyNonNull ? grp.Sum(r => r.Field<int?>(col.Ordinal)) : null;
        row.SetField(col, sum);
    }
}

我假设数字列的类型是int.

结果表:

Dan Mahoney                 null        null       1
Richard James Whitaker      null        7          null 
Wayne Dunne                 3           null       null 
于 2013-11-07T11:54:20.513 回答