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

Vb.net 从DataTable(基于日期字段)提取行并复制到另一个DataTable的最佳方法,vb.net,linq,select,datatable,Vb.net,Linq,Select,Datatable,我有一个包含大约30行的DataTable,我需要提取所有日期字段大于存储在变量中的日期的行。 (此代码将执行很多次) 我找到了三种方法,但我想知道如何选择,因为我不知道不同代码之间的区别 以下是我能写的(以及我的担忧): 第1种方式(DataTable.Select) 我担心字符串格式:我担心某些行可能由于日期格式错误而无法提取 第二条路(查询Linq) 我从未使用过Linq,所以我不知道它会给我带来什么问题 第三种方式(对于每个回路+如果-然后) 我并不真的担心这个代码。我只认为其他的可能更

我有一个包含大约30行的DataTable,我需要提取所有日期字段大于存储在变量中的日期的行。 (此代码将执行很多次)

我找到了三种方法,但我想知道如何选择,因为我不知道不同代码之间的区别

以下是我能写的(以及我的担忧):

第1种方式(DataTable.Select)

我担心字符串格式:我担心某些行可能由于日期格式错误而无法提取

第二条路(查询Linq)

我从未使用过Linq,所以我不知道它会给我带来什么问题

第三种方式(对于每个回路+如果-然后)


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

在处理30行时,更快是无关紧要的

第一种有点浪费。从一个
DataTable
开始,选择
以获取子集,然后将结果转换为一个新的
DataTable
。提取匹配行的时间:8毫秒

您可以使用
SelectedRows
数组,而无需将其放入新的
DataTable
。如果它在“一些代码”之后返回DB,我不会从DT中提取它

顺便说一下,只要DB列是日期类型(因此,
DataTable
列也将是日期类型),就没有理由担心匹配日期格式。日期没有格式;格式就是计算机(扩展到美国)向用户显示它们的方式

Dim drs = dt.Select(String.Format("StartDate > '{0}'", dtTgt.Date), "")
我传递的日期类型将与该列的
DateTime
数据进行比较/筛选。格式只有在您将其转换为字符串时才起作用,而字符串通常只适用于那些讨厌的用户


如果要反复执行,您错过的一个选项可能特别有用:A
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

如果使用此方法将数据返回数据库,则行将保留所有rowstate值

你为什么不创建一个秒表,执行你的场景并测量结果?然后你会得到“最好”的答案。谢谢你的回答和提示。我去查一下。(现在+1);)
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
Dim drs = dt.Select(String.Format("StartDate > '{0}'", dtTgt.Date), "")
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