如何从列值在列表中的数据表中 select 行?
How to select rows from a DataTable where a Column value is within a List?
假设您在 SQL 中有一个 table,并且您想要查找其中特定列可能是 3 个选项之一的所有行。你可以这样写:
SELECT * FROM MyTable WHERE uid IN (123, 456, 789)
这实际上就是我想用 VB 中的 DataTable
做的事情。我看到了这个 post:
Query rows that the datatable field contain any item in the list<string>
这似乎正是我想要的,但它并没有像我预期的那样工作。我基本上只是使用 C# -> VB 转换器并插入我的变量并想出了这个:
Dim item = From a In dtCodes.AsEnumerable() Where
lstCodes.Any(Function(x) a.Field(Of String)
("Code").ToUpper().Contains(x.ToUpper())) Select a
dtCodes
是一个包含列 Codes
的数据表。 lstCodes
是一个包含一些值的 List(Of String)
。
item
只包含 dtCodes
中的所有行,无论它们的 Code
列值是否存在于 lstCodes
.
中
我错过了什么?
编辑;请注意,如果有更简单或更好的方法,我没有使用 LINQ。
过去,我做过这样的事情:
Dim item = From r as DataRow in dtCodes.Rows
Where lstCodes.contains(r.Item("Codes"))
Select r
这样行吗?
我觉得你的代码没问题。我尝试了这个测试,它(正确地)打印出
a2
b1
Dim dtCodes As New DataTable
dtCodes.Columns.Add(New DataColumn("Code"))
dtCodes.Rows.Add("a1")
dtCodes.Rows.Add("a2")
dtCodes.Rows.Add("b1")
dtCodes.Rows.Add("b2")
Dim lstCodes As New List(Of String)
lstCodes.Add("b1")
lstCodes.Add("c1")
lstCodes.Add("a2")
Dim item = From a In dtCodes.AsEnumerable()
Where lstCodes.Any(Function(x) a.Field(Of String)("Code").ToUpper().Contains(x.ToUpper()))
Select a
For Each itm In item
Debug.WriteLine(itm("Code").ToString)
Next
这里有一个 lambda 表达式,应该也可以使用。
Dim item = dtCodes.Select.Where(Function(x As DataRow) lstCodes.Contains(x.Item("Codes")))
假设您在 SQL 中有一个 table,并且您想要查找其中特定列可能是 3 个选项之一的所有行。你可以这样写:
SELECT * FROM MyTable WHERE uid IN (123, 456, 789)
这实际上就是我想用 VB 中的 DataTable
做的事情。我看到了这个 post:
Query rows that the datatable field contain any item in the list<string>
这似乎正是我想要的,但它并没有像我预期的那样工作。我基本上只是使用 C# -> VB 转换器并插入我的变量并想出了这个:
Dim item = From a In dtCodes.AsEnumerable() Where
lstCodes.Any(Function(x) a.Field(Of String)
("Code").ToUpper().Contains(x.ToUpper())) Select a
dtCodes
是一个包含列 Codes
的数据表。 lstCodes
是一个包含一些值的 List(Of String)
。
item
只包含 dtCodes
中的所有行,无论它们的 Code
列值是否存在于 lstCodes
.
我错过了什么?
编辑;请注意,如果有更简单或更好的方法,我没有使用 LINQ。
过去,我做过这样的事情:
Dim item = From r as DataRow in dtCodes.Rows
Where lstCodes.contains(r.Item("Codes"))
Select r
这样行吗?
我觉得你的代码没问题。我尝试了这个测试,它(正确地)打印出
a2
b1
Dim dtCodes As New DataTable
dtCodes.Columns.Add(New DataColumn("Code"))
dtCodes.Rows.Add("a1")
dtCodes.Rows.Add("a2")
dtCodes.Rows.Add("b1")
dtCodes.Rows.Add("b2")
Dim lstCodes As New List(Of String)
lstCodes.Add("b1")
lstCodes.Add("c1")
lstCodes.Add("a2")
Dim item = From a In dtCodes.AsEnumerable()
Where lstCodes.Any(Function(x) a.Field(Of String)("Code").ToUpper().Contains(x.ToUpper()))
Select a
For Each itm In item
Debug.WriteLine(itm("Code").ToString)
Next
这里有一个 lambda 表达式,应该也可以使用。
Dim item = dtCodes.Select.Where(Function(x As DataRow) lstCodes.Contains(x.Item("Codes")))