使用LINQ对DataTable进行排序,逐列排序可能会有所不同

时间:2013-05-22 12:33:24

标签: vb.net linq

我需要对DataTables进行排序,但是按列排序会有所不同。

场景#1,DataTable1应按“Column1”排序。

场景#2,DataTable2应按“Column1,Column2”排序。

以下是我为此目的创建辅助函数的第一次尝试。这没问题。

Private Sub SortDataTable(ByRef dataTable As DataTable, ByVal sortColumnNames As List(Of String))
    'Validation (not shown here)

    Dim sortOrder = String.Join(", ", sortColumnNames)

    dataTable.DefaultView.Sort = sortOrder
    dataTable = dataTable.DefaultView.Table
End Sub

我尝试在LINQ中实现它,但是,我不知道如何将多个逐列传递给lambda函数。正在进行的工作代码如下所示。

Private Sub SortDataTable(ByRef dataTable As DataTable, ByVal sortColumnNames As List(Of String))
        'Validation (not shown here)

        dataTable.AsEnumerable().OrderBy(Function (row) row(sortColumnNames(0))).ThenBy(...)
    End Sub

我应该如何将多个逐列传递给OrderBy / ThenBy扩展方法?

1 个答案:

答案 0 :(得分:3)

类似的东西:

Private Function SortDataTable(table As DataTable, ParamArray columns As String()) As DataTable
    If columns.Length = 0 Then
        Return table
    End If

    firstColumn = columns.First()

    Dim result = table.AsEnumerable().OrderBy(Function(r) r(firstColumn))

    For Each columnName As var In columns.Skip(1)
        result = result.ThenBy(Function(r) r(columnName))
    Next

    Return result.AsDataView().ToTable()

End Function

从这个C#代码转换而来(我用C#编写,然后使用http://www.developerfusion.com/tools/convert/csharp-to-vb/):

DataTable SortDataTable(DataTable table, params string[] columns)
{
    if (columns.Length == 0)
    {
        return table;
    }

    firstColumn = columns.First();

    var result = table.AsEnumerable().OrderBy(r => r[firstColumn]);

    foreach (var columnName in columns.Skip(1))
    {
        result = result.ThenBy(r => r[columnName]);
    }

    return result.AsDataView().ToTable();
}
PS:没试过那个。但这很简单,所以应该没问题。