从DataTable中的每个组中选择第一行的一般方法,给出一个分组列列

时间:2013-10-16 15:54:56

标签: c# linq datatable

我可以使用此代码从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();
}

1 个答案:

答案 0 :(得分:0)

您可以将计算列添加到连接字段的表中,然后按该列分组:

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");