我有一个包含大约30行的DataTable,我需要提取日期字段大于存储在变量中的日期的所有行。 (此代码将执行很多次)
我找到了三种方法,但我想知道如何选择,因为我不知道各种代码之间的差异。
这是我能够写的(以及我的担忧):
第一路(DataTable.Select)
Dim SelectedRows() As DataRow = DT_DBData.Select("In_Date=#" & _
LastDate.ToString("yyyy-MM-dd") & "#")
Using New_Dt As DataTable = SelectedRows.CopyToDataTable
'Some code
End Using
我担心字符串格式:我担心因日期格式化错误而无法提取某些行。
第二路(查询Linq)
Using New_Dt As DataTable = (From DBData In DT_DBData.AsEnumerable() _
Where DBData.Field(Of Date)("In_Date") >= LastDate).CopyToDataTable
'Some code
End Using
我从未使用过Linq,因此我不知道它能给我带来什么样的问题。
第3路(For Each Loop + If Then)
Using New_Dt As DataTable = DT_DBData.Clone
For Each dr As DataRow In DT_DBData.Rows
If dr("In_Date") >= LastDate Then
New_Dt.Rows.Add(dr.ItemArray)
End If
Next
'Some code
End Using
我并不担心这段代码。我只认为其他人可能会更好或更快(但我无法回答这个问题)
答案 0 :(得分:1)
在处理30行时,速度有点无关紧要。
第一个是浪费。您从DataTable
,Select
开始获取子集,然后将结果转换为新的DataTable
。提取匹配行的时间:8毫秒。
您可以使用SelectedRows
数组,而无需将其放入新的DataTable
。如果它在“某些代码”之后返回到DB,我就不会从DT中提取它。
顺便说一下,只要DB列是日期类型(因此,DataTable
列也是),就没有理由担心匹配日期格式。日期不有格式;格式就是计算机(以及扩展,我们)如何向用户显示它们。
Dim drs = dt.Select(String.Format("StartDate > '{0}'", dtTgt.Date), "")
我传递的日期类型将与该列的DateTime
数据进行比较/过滤。格式只有在你将它们转换为字符串时才能发挥作用,而这只是那些讨厌的用户所需要的。
如果一遍又一遍地完成,您错过的一个选项可能会特别有用:DataView
:
dt.Load(cmd.ExecuteReader)
' create dataview
Dim dv As New DataView(dt)
dv.RowFilter = String.Format("StartDate > '{0}'", dtTgt.Date)
dv.Sort = "StartDate asc"
' show/iterate/whatever
dgv.DataSource = dv
如果数据返回到DB,则使用此方法,行将保留所有rowstate值。