动态DataTable Group by和Aggregate函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态DataTable Group by和Aggregate函数相关的知识,希望对你有一定的参考价值。
我正在尝试在我拥有的数据表上应用SQL-Like组。但是我不能简单地使用其他人建议的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));
}
另一答案
我同意你不能使用Linq动态选择列案例。虽然您可能需要稍后更改列名,但以下内容应该有效。
DataTable table = new DataTable();
table.Columns.Add("Col1", typeof(int));
table.Columns.Add("Col2", typeof(string));
table.Columns.Add("Col3", typeof(string));
//Your data
table.Rows.Add(1, "A", "B");
table.Rows.Add(2, "A", "B");
table.Rows.Add(3, "C", "C");
table.Rows.Add(4, "C", "");
//Type
string chosen = "Col2"; //User-chosen grouping type.
List<string> columns = new List<string> { "Col1", "Col2", "Col3" };
//LINQ
var query = table.AsEnumerable().GroupBy(x => x[chosen]).Select(x => {
ArrayList sampleObject = new ArrayList();
foreach (var count_col in columns)
{
if (count_col == chosen)
{
sampleObject.Add(x.Key.ToString());
}
else
{
sampleObject.Add(x.Sum(y => y[count_col].ToString() == "" ? 0 : 1));
}
}
return sampleObject;
});
//result
foreach (var r in query)
{
Console.WriteLine("{0} {1} {2}", r[0], r[1], r[2]);
}
以上是关于动态DataTable Group by和Aggregate函数的主要内容,如果未能解决你的问题,请参考以下文章
Uipath datatable group by归类合并相加