我正在尝试使用DataTable
函数
Select
中过滤数据
Dim dr() As DataRow = Nothing
Dim DtDataSource As DataTable
'value is populated here in DataTable (12,000 Records)
dr = DtDataSource.Select("[Name] like '[PAPER]*'") 'Gives Error
我尝试从DataTable获取数据的最后一行会抛出错误,因为我使用了大括号' [' 和' ]'
在 C#中,我们可以使用以下代码来解决它
dr = DtDataSource.Select("[Name] like '\[PAPER\]*' ESCAPE '\\'");
但如果我在这里使用相同的概念,则会出现以下错误
语法错误:' ESCAPE'之后缺少操作数操作
现在无论如何我可以从DataTable中获取数据,该数据以短语 [PAPER] 开头?
答案 0 :(得分:1)
你应该以这种方式逃避方括号
dr = DtDataSource.Select("[Name] like '[[]PAPER[]]%'")
另一种方法是使用LINQ从DataTable中提取信息
rows = DtDataSource.AsEnumerable().
Where(Function(row) row.Field(OfType String)("Name").
StartsWith("[PAPER]")
.... work with the datarow collection
For Each row as DataRow in rows
.....
Next
答案 1 :(得分:0)
你注意到你的DataRow
是一个数据行数组吗?你声明:Dim dr() As DataRow = Nothing
而不是Dim dr As DataRow = Nothing
(只是确定)。
如果你需要包含字符串[Paper]的多行,请使用第三个例子并将所有行提取到一个新的DataTable
。如果您只需要一个不同的行,请使用第一个\第二个示例。您可以使用linq \ lambda expiration:
Public Sub ex2()
Dim dr As DataRow = Nothing
Dim DtDataSource As DataTable
' 1. example with linq'
dr = (From row In DtDataSource.AsEnumerable()
Where row.Field(Of String)("Name").Contains("[PAPER]") Select row).FirstOrDefault()
' 2. example with lambda expiration'
dr = DtDataSource.AsEnumerable().Where(Function(x) x.Field(Of String)("Name").Contains("[PAPER]")).Select(Function(y) y).FirstOrDefault()
' 3. but if you want all the rows that containes [Paper] you can do it like that:'
Dim tempDt As DataTable = DtDataSource.AsEnumerable().Where(Function(x) x.Field(Of String)("Name").Contains("[PAPER]")).Select(Function(y) y).CopyToDataTable()
End Sub