我正在尝试根据最新的日期值从数据表中过滤行。目前我正在使用字典对象,这不适合我的实际目标,因为我的数据表将有两列以上,从而使字典对象的键,值特征无效。凭借我有限的知识,我自己相对较新.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返回行,而不仅仅是两列。
的问候,
答案 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" 。
注意:我建议将maxDt
和minDt
投射到日期数据类型:
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")