【问题标题】:VB.Net datatable, select rows based on maximum valuesVB.Net数据表,根据最大值选择行
【发布时间】:2015-01-16 10:49:04
【问题描述】:

我正在尝试根据最新日期值过滤数据表中的行。目前我正在使用字典对象,这不适合我的实际目标,因为我的数据表将有两列以上,从而使字典对象的键值特征无效。忍受我有限的知识,我自己对 .net 开发和学习的东西还比较陌生。

我目前的编码是

Module Module1

Sub Main()
    Dim names As Dictionary(Of String, DateTime) = New Dictionary(Of String, Date)
    Dim dt As New DataTable
    Dim strDetail As String = Nothing

    dt.Columns.Add("Name")
    dt.Columns.Add("punchdate", Type.GetType("System.DateTime"))

    dt.Rows.Add("Rajesh", "01-jan-2014")
    dt.Rows.Add("Rajesh", "01-feb-2014")
    dt.Rows.Add("Rajesh", "01-apr-2014")
    dt.Rows.Add("Rajesh", "01-sep-2014")
    dt.Rows.Add("John", "15-sep-2014")


    For Each row As DataRow In dt.Rows
        strDetail = row.Item("Name")
        'Debug.WriteLine(strDetail)
        If names.ContainsKey(strDetail) Then
            If names(strDetail) < row.Item("punchdate") Then
                names(strDetail) = row.Item("punchdate")
            End If
        Else
            names.Add(row.Item("Name"), row.Item("punchdate"))

        End If
    Next row

    For Each kvp As KeyValuePair(Of String, DateTime) In names
        Dim v1 As String = kvp.Key
        Dim v2 As DateTime = kvp.Value

        Debug.WriteLine(v1 + ";   " + v2.ToString)

    Next
End Sub

结束模块

请让我知道,根据我的要求,这应该是最佳解决方案,即根据最大打孔日期返回行并且不仅仅是两列。

问候,

【问题讨论】:

  • 字典可以包含复杂的 TValue 类型。例如,整个员工或客户记录。因此,您可以将合格 DT,Row 的全部内容存储在 Dictionary(of String, MyClass)
  • Plunotix,谢谢。我需要了解更多信息 :) 实际上,我的数据表将有多个员工的多条记录,我需要根据每个员工的记录可用的最大日期来检索每个员工的最新记录。你能指出我的工作代码块吗?
  • This answer 可能会有所帮助 - 情况类似。它至少将 Class 对象说明为 Dictionary 中的 TValue。对于关键,如果您只希望每个 emp 有一条记录,我会使用更可能是唯一的东西,例如 EmpID 或其他东西。

标签: c# vb.net datatable


【解决方案1】:

由于您已经拥有 DataTable 中的值,您可以使用 Compute 方法查找最近的日期。

Dim maxDt as Object = dt.Compute("MAX(punchdate)", "")
Dim minDt as Object = dt.Compute("MIN(punchdate)", "")

在您的示例中,maxDt 将是“John”、“15-sep-2014”的最新条目,minDt 将是“Rajesh”、“01-jan-2014”的最旧条目。

注意:我建议将 maxDtminDt 转换为 Date 数据类型:

Dim maxDt as Date = Date.Parse(dt.Compute("MAX(LAST_LOGIN_DATE)", "").ToString())

【讨论】:

  • 你好戴夫,我能够获得最大日期值,但是我需要从数据表中获取所有行及其最大日期,从而针对我的示例场景返回两行。谢谢
【解决方案2】:

对于最大打孔日期,您可以使用

Dim Max1 = rows.Max(Function(r) r.Field(Of <DateTime type>)("punchdate"))

并使用

Dim rows=MyTable.Select("ID=Max1 ")

根据选定的最大打卡日期返回整行。

如果你想单独为一行单独选择多个列值,那么你可以使用

TempDt =New DataView(Rows.CopyToDataTable()).ToTable(False, 
"columnname1", "name2","...","..")

【讨论】:

  • 感谢 Kaustav,您能否用我的问题中提到的列重写代码块。非常抱歉,我无法根据我的代码找出您的示例。
  • 如果我没记错的话,您提供的是 C# 代码示例,而我在 VB.Net 中需要它们
  • 这些都是vb.net代码。 C# 没有任何 Dim 说明符。
  • 我的错!在假设代码块用于 C# 之前,我什至没有足够的观察。道歉
【解决方案3】:

我按照here提供的示例完成了它

我已经修改了我的代码,如下所示,最终代码块如下

Imports System.Linq

模块模块1 将 dt 调暗为新数据表

Sub Main()

    ' http://forums.asp.net/t/1826584.aspx?Select+DataRow+with+latest+date+using+LINQ



    dt.Columns.Add("ID", Type.GetType("System.Int32"))
    dt.Columns.Add("Name")
    dt.Columns.Add("punchdate", Type.GetType("System.DateTime"))

    dt.Rows.Add(100, "Rajesh", "01-jan-2014")
    dt.Rows.Add(101, "Rajesh", "01-feb-2014")
    dt.Rows.Add(102, "Rajesh", "01-apr-2014")
    dt.Rows.Add(103, "Rajesh", "01-sep-2014")
    dt.Rows.Add(104, "John", "15-sep-2014")


    ' Dim Max1 = rows.Max(Function(r) r.Field(Of DateTime)("punchdate"))



    Dim myLINQ = From grp In From dt In dt.AsEnumerable() _
                             Group dt By GRP = dt.Field(Of String)("Name") Into Group _
                             Select New With { _
                                 Key .ID = Group.Max(Function(T) T.Field(Of Int32)("ID")), _
                                 Key .Name = GRP, _
                                 Key .[Date] = Group.Max(Function(T) T.Field(Of DateTime)("punchdate")) _
                                            }
    Debug.WriteLine("=======================================")

    For Each g In myLINQ
        ' Debug.WriteLine("Numbers that match '{0}':", g.Name)
        Debug.WriteLine(g.Name & "----->" + g.Date.ToString)

    Next




End Sub

结束模块

谢谢大家!

【讨论】:

    【解决方案4】:

    这是您根据最大打孔日期选择整行的代码:

    Dim Max1 = rows.Max(Function(r) r.Field(DateTime)("punchdate"))
    Dim rows=MyTable.Select("punchdate=Max1 ")
    

    或者,如果您想以通用方式从数据表中选择记录,则可以使用

    TempDt =New DataView(Rows.CopyToDataTable()).ToTable(False, 
    "ID", "Name","punchdate")
    

    【讨论】:

    • Kaustav 一个愚蠢的问题,当我按照给定的顺序复制提供的代码块时,“行”显示为未定义,请告诉我为什么会出现这样的错误?
    • 如果它给出了这样的错误,那么你可以简单地声明 Dim rows pervious to this implementation,然后使用 rows 从 Datatable 中选择行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2021-09-12
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多