VB.net Linq加入了两个专栏

时间:2014-08-07 22:38:47

标签: vb.net linq

请帮帮我。这是我的第一个LINQ。

我有两个数据表,我需要加入两个字段。

我该怎么做?

我尝试了以下但是加入不起作用。 “yk.Field(Of String)(”secNo“)”出错,消息为“匿名类型成员名称只能从没有参数的简单或限定名称推断”

    Dim dtYk As DataTable = New DataTable("dtYk")
    dtYk.Columns.Add("secNo")
    dtYk.Columns.Add("BomLine")
    dtYk.Rows.Add("EA(1)", 1)
    dtYk.Rows.Add("EA(8)", 17)

    Dim dtIvt As DataTable = New DataTable("dtIvt")
    dtIvt.Columns.Add("secNo")
    dtIvt.Columns.Add("BomLine")
    dtIvt.Columns.Add("PartCode")
    dtIvt.Rows.Add("EA(1)", 1, "TRML07-32-LH-ASSY**")
    dtIvt.Rows.Add("EA(8)", 17, "328")

    ' Create a DataSet. Put both tables in it.
    Dim dsYk As DataSet = New DataSet("dsYk")
    dsYk.Tables.Add(dtYk)

    Dim dsIvt As DataSet = New DataSet("dsIvt")
    dsIvt.Tables.Add(dtIvt)

    Dim LinQuery = From yk In dtYk.AsEnumerable
                   Join ivt In dtIvt.AsEnumerable
                   On New With {yk.Field(Of String)("secNo") , yk.Field(Of String)("BomLine")} Equals New With {ivt.Field(Of String)("secNo") , ivt.Field(Of String)("BomLine")}
                   Select New With {yk.Field(Of String)("secNo") , yk.Field(Of String)("BomLine"),ivt.Field(Of String)("secNo")}

这是一个有效的简单版本。但这只加入一个字段并只选择一个表。

Dim LinQuery = From yk In dtYk.AsEnumerable()
                       Join ivt In dtIvt.AsEnumerable()
                       On yk.Field(Of String)("secNo") Equals ivt.Field(Of String)("secNo")
                       Select yk

        Dim dt As New DataTable
        dt = LinQuery.CopyToDataTable

我的目标是加入两个字段,select应该是yk.SecNo,yk.BomLine和ivt.PartCode。请帮忙。谢谢

3 个答案:

答案 0 :(得分:1)

使用And关键字加入复合键应该有效(请参阅MSDN article,部分"使用复合键执行连接")。快速测试证明了这一点:

Dim dtYk As New DataTable()
dtYk.Columns.Add("secNo")
dtYk.Columns.Add("BomLine")
dtYk.Rows.Add(1, 3)
dtYk.Rows.Add(2, 4)
dtYk.Rows.Add(3, 5)

Dim dtIvt As New DataTable
dtIvt.Columns.Add("secNo")
dtIvt.Columns.Add("BomLine")
dtIvt.Rows.Add(1, 3)
dtIvt.Rows.Add(2, 5)
dtIvt.Rows.Add(3, 4)
Dim LinQuery = From yk In dtYk.AsEnumerable
               Join ivt In dtIvt.AsEnumerable
               On yk.Field(Of String)("secNo") Equals ivt.Field(Of String)("secNo") And
                  yk.Field(Of String)("BomLine") Equals ivt.Field(Of String)("BomLine")
               Select New With {.secNo1 = yk.Field(Of String)("secNo"),
                                 .bomLine = yk.Field(Of String)("BomLine"),
                                 .bomLine2 = ivt.Field(Of String)("BomLine")}
For Each o As Object In LinQuery
    'the output is only one row :'
    '{ secNo1 = 1, bomLine = 3, bomLine2 = 3 }'
    Console.WriteLine(o)
Next

关于您收到的错误消息,这意味着您需要为匿名类型手动指定成员字段名称(上面示例中的Select clasue中也说明了这一点)。

答案 1 :(得分:1)

@ har07表明您可以使用And加入复合键,这是最佳答案,但如果您想知道为什么匿名类型不起作用,则需要使用{{1}标记哪些属性用于相等性检查,否则通过引用进行比较。因此,以下内容也可以正常工作,但不如Key版本那么可读。

And

答案 2 :(得分:0)

VB.Net LINQ - left outer join between two datatables - limit to one row

类似的问题

忽略一行。

此外,您需要将此作为您的ON线加入两个字段

on yk.Field(Of String)(“secNo”)等于ivt.Field(Of String)(“secNo”)和yk.Field(Of String)(“BomLine”)等于ivt.Field(Of String) ( “BomLine”)