从DataTable中提取行的最佳方法(基于日期字段)并复制到另一个DataTable

时间:2016-01-13 11:24:28

标签: vb.net linq select datatable

我有一个包含大约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

我并不担心这段代码。我只认为其他人可能会更好或更快(但我无法回答这个问题)

1 个答案:

答案 0 :(得分:1)

在处理30行时,速度有点无关紧要。

第一个是浪费。您从DataTableSelect开始获取子集,然后将结果转换为新的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值。