请帮帮我。这是我的第一个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。请帮忙。谢谢
答案 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)
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”)