2013-05-22 38 views
2

我需要對DataTables進行排序,但按列排序會有所不同。使用LINQ對DataTable進行排序時,按列排序時可能會有所不同

場景#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擴展方法?

+0

OrderBy => ThenBy –

回答

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:沒有測試。但這很簡單,所以應該沒問題。

+0

該死!我錯過了將LINQ表達式存儲到變量中,這就是爲什麼ThenBy不可用。非常感謝。 – Channs

+0

____沒問題。 –

相關問題