【问题标题】:Sort DataTable based on two column, whichever greater根据两列对 DataTable 进行排序,以较大者为准
【发布时间】:2017-06-22 04:07:41
【问题描述】:

我有一张类似(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,否则为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),比较器 As System.Collections.Generic.IComparer(Of TKey)) 作为 System.Data.OrderedEnumerableRowCollection(Of System.Data.DataRow)' 不能在“System.Data.EnumerableRowCollectionExtensions”中定义 从这些论点推断。明确指定数据类型 可能会纠正这个错误。

我该如何解决?

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

【问题讨论】:

  • 我认为问题在于您试图使用 VB.NET If 内在函数作为 OrderByDescending 中的排序函数,但这不适用于 VB 的类型推导。建议尝试将其放在 lambda 函数中。

标签: vb.net linq lambda


【解决方案1】:

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()

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2023-04-06
    相关资源
    最近更新 更多