从数据表中每个组中选择第一行的一般方法,给出分组列的列表
本文关键字:列表 方法 数据表 选择 一行 | 更新日期: 2023-09-27 18:35:34
我可以使用此代码从DataTable获取每个组(按ID分组)的每一第一行:
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable();
但它只对 ID 进行分组,我必须自己对其进行硬编码。
我想知道是否有通用方法,可以放入列名列表进行分组。
public DataTable GetFirstFromEachGroupBy(List<string> GroupByColumns)
{
dt = dt.AsEnumerable().GroupBy(GroupByColumns).Select(g => g.First()).CopyToDataTable();
}
您可以将计算列添加到连接字段的表中,然后按该列进行分组:
string newcolExpression = @"' ' + " + string.Join(" + ",GroupByColumns) ; // prepend a space to ensure string concatenation
// e.g. "' ' + ID1 + ID2"
dt.Columns.Add("GroupBy",typeof(string),newcolExpression);
dt = dt.AsEnumerable()
.GroupBy(r => r["GroupBy"])
.Select(g => g.OrderBy(r => r["PK"]).First())
.CopyToDataTable();
dt.Columns.Remove("GroupBy");