我正在尝试加入两个数据表,这些数据表在搜索网页后几乎已经完成了。
我遇到的问题是它只显示匹配的行;如何在t1中显示所有行,然后如果匹配显示列中的某些内容,表示匹配?
以下是我正在使用的代码:
Dim Query = From t1 In dt.AsEnumerable() Join t2 In dt2.AsEnumerable()
On t1.Field(Of String)("Surname") Equals t2.Field(Of String)("VisitorFob")
Select New With {.Surname = t1.Field(Of String)("Surname"), .VisitorFob = t2.Field(Of String)("VisitorFob")}
Dim newTable As New DataTable()
newTable.Columns.Add("Surname", GetType(String))
newTable.Columns.Add("VisitorFob", GetType(String))
For Each rowInfo In Query
newTable.Rows.Add(rowInfo.Surname, rowInfo.VisitorFob)
Next
答案 0 :(得分:0)
您可以使用与this question类似的左外连接来包含第一个表中的数据,无论匹配如何。
LEFT OUTER JOIN从第一个表中获取所有记录,无论第二个表是否匹配。如果匹配,则获取第二个表的值,如果没有匹配则返回NULL。 article explaing some of the linq query methods
我没有对此进行测试,但我认为如果您当前的查询有效,这将适用于您的查询:
Dim Query = From t1 In dt.AsEnumerable()
Group Join t2 In dt2.AsEnumerable()
On t1.Field(Of String)("Surname") Equals t2.Field(Of String)("VisitorFob")
Into temp = Group
From b In temp.DefaultIfEmpty()
Select New With {.Surname = t1.Field(Of String)("Surname"),
.VisitorFob = If(b Is Nothing, String.Empty, b.Field(Of String)("VisitorFob"))}
Dim newTable As New DataTable()
newTable.Columns.Add("Surname", GetType(String))
newTable.Columns.Add("VisitorFob", GetType(String))
For Each rowInfo In Query
newTable.Rows.Add(rowInfo.Surname, rowInfo.VisitorFob)
Next
从t2返回的“VisitorFob”值将为null,表示与t1不匹配,因为左外连接将返回t1值而没有匹配的t2值。