对DataTable进行排序,基于两列,以较大者为准

时间:2017-06-22 04:07:41

标签: vb.net linq lambda

我有一张表(日期格式为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 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

但是我收到了错误

  

扩展方法' Public中类型参数的数据类型   函数OrderByDescending(Of TKey)(keySelector As System.Func(Of。)   System.Data.DataRow,TKey),comparer As   System.Collections.Generic.IComparer(Of TKey))As   System.Data.OrderedEnumerableRowCollection(Of System.Data.DataRow)'   在System.Data.EnumerableRowCollectionExtensions'中定义。不可能是   从这些论点中推断出来。明确指定数据类型   可能会纠正此错误。

我该如何解决?

标记了c#因为我可以从c#转换它。

1 个答案:

答案 0 :(得分: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()