VB.Net数据表,根据最大值选择行

时间:2015-01-16 10:49:05

标签: c# vb.net datatable

我正在尝试根据最新的日期值从数据表中过滤行。目前我正在使用字典对象,这不适合我的实际目标,因为我的数据表将有两列以上,从而使字典对象的键,值特征无效。凭借我有限的知识,我自己相对较新.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

结束模块

请告诉我这应该是最佳解决方案,基于我的要求,根据max punchdate返回行,而不仅仅是两列。

的问候,

4 个答案:

答案 0 :(得分: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投射到日期数据类型:

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

答案 1 :(得分:0)

对于max punchdate,您可以使用

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","...","..")

答案 2 :(得分:0)

我按照提供的here

示例完成了这项工作

我修改了我的代码,如下面的&amp;最后的代码块如下所示

Imports System.Linq

模块Module1     Dim dt As New DataTable

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

结束模块

谢谢大家!

答案 3 :(得分:0)

以下是您根据最大标记选择整行的代码:

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")
相关问题