首页 > 解决方案 > Dynamic DataTable Group by 和 Aggregate 函数

问题描述

我正在尝试在我拥有的数据表上应用 SQL-Like group by。但是我不能简单地使用其他人建议的 LINQ 答案,因为我不知道运行时之前的列 - 用户选择它们。然而,每一列要么有一个聚合函数,要么包含在分组依据中。想象一下这样的桌子

WW     XXX     YYYY
1        A        B
2        A        B
3        C        C
4        C        

我只知道用户想要按一列分组 - 然后我想在其余列上应用 COUNT ,因此如果用户选择了 XXX,新表如下所示:

COUNT(WW)     XXX     COUNT(YYYY)
2               A               2
2               C               1

标签: c#wpflinq

解决方案


您可以使用这种方法:

string columnToGroup = "XXX";  // user selected
DataTable aggrTable = new DataTable();
aggrTable.Columns.Add(columnToGroup);

var aggrColumns = tbl.Columns.Cast<DataColumn>()
    .Where(c => !c.ColumnName.Equals(columnToGroup, StringComparison.InvariantCultureIgnoreCase));

foreach (DataColumn col in aggrColumns)
    aggrTable.Columns.Add(col.ColumnName, typeof(int));

var grpQuery = tbl.AsEnumerable().GroupBy(r => r[columnToGroup]);
foreach (var grp in grpQuery)
{
    DataRow row = aggrTable.Rows.Add();
    row[columnToGroup] = grp.Key;
    foreach (DataColumn col in aggrColumns)
        row[col.ColumnName] = grp.Count(r => !r.IsNull(col.ColumnName));
}

推荐阅读