2017-06-22 4 views
1

2つの列に基づいたDataTable、ソート私は(MM/DD/YYYYの形式で日付)のようなテーブルを持っている方も大きく

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、そうでない場合はadmincancelate(より大きい日付)、それより小さい日付です。私は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 

ですが、私は型パラメータ(秒の誤差

データ型(複数可)を取得しています

)内の拡張メソッド 'Public 関数OrderByDescending(Of TKey)(keySelector As System.Func(Of(System.Data.DataRow、TKey)、コンストラクター System.Collections.Generic.IComparer(Of TKey))As System.Data.OrderedEnumerableRowCollection(Of System.Data.DataRow) 'System.Data.EnumerableRowCollectionExtensionsで定義されている 'は、これらの引数から推測される にはなりません。明示的にデータ型を指定すると、 がこのエラーを修正する可能性があります。

どうすれば解決できますか?

タグが付いているのでC#からも変換できます。

+0

私はこの問題は、あなたがOrderByDescending' 'でソート機能として本来のIf'' VB.NETを使用しようとしているということだと思いますが、これはVBの型推論では動作しません。ラムダ関数の中に入れてみてください。 – Craig

答えて

0

OrderBy関数は、式ではなくデリゲート関数またはラムダ関数を使用します。 ConvertToDate関数はラムダ関数ではなく、式を取ります。

不要なかっこを削除し、.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() 
関連する問題