c# - 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
解决方案
您可以使用这种方法:
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));
}
推荐阅读
- c# - 如何在 C# 中使用带有公共 asc 密钥的 BouncyCastle 加密纯文本/字符串?
- python - (Py)OpenCL 同时修改所有线程的值
- c# - XamDataGrid 中的 XamComboBoxField 为空
- jquery - 内联的宏伟弹出窗口!使用 animate.css
- java - 如何构建仅使用 for 循环列出一串阶乘的代码?
- jenkins - 获取上次成功定时器链接的链接
- php - 不确定“'PDOStatement' 的序列化”在哪里发生?
- deno - Deno 的表现
- html - 当不同的窗口大小时,img 标签似乎给出了空白
- teamcity - Teamcity.pullRequest.number 在 Teamcity 中未识别