2017-06-22 19 views
1

我有一個像(日期以mm/dd/yyyy格式)排序的DataTable基於兩個專欄,取其較大

ID blocked_date admincanceldate 
................................. 
1 06/06/2017 08/06/2017 
1 07/06/2017 DBNULL 
1 04/06/2017 09/06/2017 
1 DBNULL  03/06/2017 
1 02/06/2017 01/06/2017 

我想基於以下條件排序表,

如果blocked_date大於admincanceldate,然後通過blocked_date else admincanceldate(更高的日期),然後更小的日期。

我使用VB.Net和我的查詢是

dtCorporateDetails = dtCorporateDetails.AsEnumerable() _ 
        .OrderByDescending(If((ConvertToDate(Function(c) c.Field(Of Object)("admincanceldate"))) > (ConvertToDate(Function(c) c.Field(Of Object)("blocked_date"))), (ConvertToDate(Function(c) c.Field(Of Object)("admincanceldate")))), (ConvertToDate(Function(c) c.Field(Of Object)("blocked_date")))) _ 
        .ThenByDescending(If((ConvertToDate(Function(c) c.Field(Of Object)("admincanceldate"))) > (ConvertToDate(Function(c) c.Field(Of Object)("blocked_date"))), (ConvertToDate(Function(c) c.Field(Of Object)("blocked_date"))), (ConvertToDate(Function(c) c.Field(Of Object)("admincanceldate"))))) _ 
        .CopyToDataTable() 

Private Function ConvertToDate(ByVal obj As Object) As Nullable(Of Date) 
     Dim retDate As Date = Nothing 

     If Not IsDBNull(obj) Then 
      retDate = CDate(obj) 
     End If 

     Return retDate 
    End Function 

但我得到一個錯誤的類型參數的

數據類型(S)(S )在擴展方法'Public Function OrderByDescending(Of TKey)(keySelector As System.Func(Of)的System.Data.DataRow,TKEY的),比較器作爲 System.Collections.Generic.IComparer(OF TKEY的))作爲 System.Data.OrderedEnumerableRowCollection(OF的System.Data.DataRow)System.Data.EnumerableRowCollectionExtensions ' 中定義' '不能從這些論據推斷出 。明確指定數據類型 可能會更正此錯誤。

我該如何解決?

tagged c#因爲我也可以從c#轉換它。

+0

我認爲問題是,你要使用VB.NET'If'內在作爲'OrderByDescending'排序功能,但這並不用VB的類型推演工作。建議嘗試將其放入lambda函數中。 – Craig

回答

0

OrderBy函數使用委託或lambda函數,而不是表達式。 ConvertToDate函數接受一個表達式,而不是lambda函數。

刪除了不必要的括號和使用.Field(Of Object),這對您沒有幫助(也可能是c.Field(Of DateTime)("..."))。

dtCorporateDetails = dtCorporateDetails.AsEnumerable() _ 
      .OrderByDescending(Function(c) If(ConvertToDate(c("admincanceldate")) > ConvertToDate(c("blocked_date")), ConvertToDate(c("admincanceldate")), ConvertToDate(c("blocked_date"))) _ 
      .ThenByDescending(Function(c) If(ConvertToDate(c("admincanceldate")) > ConvertToDate(c("blocked_date")), ConvertToDate(c("blocked_date")), ConvertToDate(c("admincanceldate")))) _ 
      .CopyToDataTable()