c# - DataTable linq查询按列分组

标签 c# linq group-by

我使用 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 查询来实现预期的结果。

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

最佳答案

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

然后可以在源表的键列上使用 Enumerable.GroupBy。最后使用循环添加具有聚合值的 DataRow:

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 

关于c# - DataTable linq查询按列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834954/

相关文章:

c# - 在 using 语句内部还是外部返回?

c# - 访问服务器的 Windows 身份验证

c# - 使用 Linq 生成要从另一个集合中删除的事物的集合

python - 对 pandas 数据框列执行多次转换

python - 如何使用groupby选择条件行?

Mysql - 条件分组依据

c# - Directory.Exists 导致编译错误

c# - 使用 List<T> 的 Linq 查询

c# - 如何在设计时不知道要选择的属性的名称的情况下编写 linq select 语句?

c# - 有人可以提供 ImageCompare 方法的示例吗?