与Linq一起加入两个数据表

时间:2017-10-10 15:22:15

标签: vb.net linq

我正在尝试加入两个数据表,这些数据表在搜索网页后几乎已经完成了。

我遇到的问题是它只显示匹配的行;如何在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

1 个答案:

答案 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值。