【发布时间】:2020-11-16 17:24:11
【问题描述】:
我有 2 个数据表:
TableA:
id | name | phone
-----------------
1 | Paul | 8523
2 | John | 5217
3 | Stan | 5021
TableB:
id
--
2
5
我想在它们之间进行左排除连接:我想要一个 DataTable 对象,其中包含TableA 的所有行,在TableB 中具有相应的id 列。
我想要的结果是这样的:
id | name | phone
-----------------
1 | Paul | 8523
3 | Stan | 5021
我已经使用for 循环完成了这项工作,但我认为如果我使用 LINQ 会更简单。问题是我尝试过的所有方法都不起作用。
如何使用 LINQ 做到这一点?
带有for 循环的代码是这样的:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim table = LeftExcludingJoin()
If table IsNot Nothing Then
For Each row As DataRow In table.Rows
Console.WriteLine(row.Item("id") & " - " & row.Item("name") & " - " & row.Item("phone"))
Next
End If
End Sub
Private Function LeftExcludingJoin() As DataTable
Dim tableA As New DataTable
tableA.Columns.Add("id")
tableA.Columns.Add("name")
tableA.Columns.Add("phone")
Dim tableB As New DataTable
tableB.Columns.Add("id")
'Rows for tableA
Dim rowA1 As DataRow = tableA.NewRow
rowA1.Item("id") = 1
rowA1.Item("name") = "Paul"
rowA1.Item("phone") = 8523
tableA.Rows.Add(rowA1)
Dim rowA2 As DataRow = tableA.NewRow
rowA2.Item("id") = 2
rowA2.Item("name") = "John"
rowA2.Item("phone") = 5217
tableA.Rows.Add(rowA2)
Dim rowA3 As DataRow = tableA.NewRow
rowA3.Item("id") = 3
rowA3.Item("name") = "Stan"
rowA3.Item("phone") = 5021
tableA.Rows.Add(rowA3)
'Rows for tableB
Dim rowB1 As DataRow = tableB.NewRow
rowB1.Item("id") = 2
tableB.Rows.Add(rowB1)
Dim rowB2 As DataRow = tableB.NewRow
rowB2.Item("id") = 5
tableB.Rows.Add(rowB2)
'Get rows in A which are not in B
Dim tableResult = tableA.Clone
If tableA IsNot Nothing Then
If tableB IsNot Nothing Then
For Each rowA As DataRow In tableA.Rows
Dim coincidence As Boolean = False
For Each rowB As DataRow In tableB.Rows
If rowA.Item("id") = rowB.Item("id") Then
coincidence = True
Exit For
End If
Next
If coincidence = False Then
Dim newResultRow As DataRow = tableResult.NewRow
newResultRow.Item("id") = rowA.Item("id")
newResultRow.Item("name") = rowA.Item("name")
newResultRow.Item("phone") = rowA.Item("phone")
tableResult.Rows.Add(newResultRow)
End If
Next
Else
'All tableA values are part of the result because tableB is Nothing.
Return tableA
End If
Return tableResult
Else
Return Nothing
End If
End Function
【问题讨论】:
标签: .net vb.net linq datatable