LINQ - 在运行时确定的多列组DataTable

时间:2012-04-30 23:09:22

标签: linq .net-3.5 datatable group-by

使用.NET 3.5,我需要将DataTable分组为多列,其中列名称包含在IEnumerable中。

// column source
IEnumerable<string> columns;
DataTable table;

IEnumerable<IGrouping<object, DataRow>> groupings = table
    .AsEnumerable()
    .GroupBy(row => ???);

通常???是匿名类型,如here所述,但我需要使用columns作为列源。这可能吗?

1 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法是创建一个函数,该函数选择所需的列并创建用于比较的哈希。我会做这样的事情:

Func<DataRow, IEnumerable<string>, string> f = (row, cols) => 
    String.Join("|", cols.Select(col => row[col]));

这是一个DataRowIEnumerable<string>的函数。它将IEnumerable<string>(列名称)投影到相应的列值(cols.Select(col => row[col])))中,然后将这些值与|字符连接起来。我之所以选择这个角色是因为它不太可能包含在你的字段中,但是你可能想换掉另一个分隔符。

然后简单地

IEnumerable<IGrouping<object, DataRow>> groupings = table
    .AsEnumerable()
    .GroupBy(row => f(row, columns));

理想情况下,我们会选择更好的类型 - 而不是使用任意分隔符绑定的字符串。但是我希望选择一个对象会因为引用类型的比较而导致问题,因为两个对象即使它们具有相同的属性也不相等。