首页 > 解决方案 > .NET LINQ 左连接问题

问题描述

我在尝试查询并左连接两个 DataTable 对象时遇到问题。让我首先说,是的 - 我必须首先这样做是愚蠢的。在查询中离开连接会容易得多,但我受制于一次只能从 SAP 中查询一个表的限制。所以,这是我的问题。我已经能够从 SAP 检索两个 DataTable 对象,并且添加了调试消息并验证了每个表中有数千条记录。如果存在详细记录,我需要根据 6 个关键列将详细表 (dtDtl) 左连接到余额表 (dtBal)。

这是我试图开始工作的代码部分:

'Call the GetData() function to return a DataTable
Me.fieldList = {"BUKRS", "RACCT", "KOSTL", "PRCTR", "RYEAR", "POPER", "HSL", "ENTERED_DATE"}
Me.tblName = "ZTTRAIL_BALANCE"
Dim dtBal As DataTable = GetData()
dtBal.TableName = tblName

'Call the GetData() function to return a DataTable
Me.fieldList = {"BUKRS", "RACCT", "KOSTL", "PRCTR", "RYEAR", "POPER", "HSL", "LIFNR", "NAME1", "BUDAT", "BLDAT", "BLART", "ENTERED_DATE"}
Me.tblName = "ZTTRAIL_BAL_GRAN"
Dim dtDtl As DataTable = GetData()
dtDtl.TableName = tblName
             
'Create a DataTable to return
Dim dtJoined As New DataTable
dtJoined.Columns.Add("BUKRS", GetType(String))
dtJoined.Columns.Add("RACCT", GetType(String))
dtJoined.Columns.Add("KOSTL", GetType(String))
dtJoined.Columns.Add("PRCTR", GetType(String))
dtJoined.Columns.Add("RYEAR", GetType(String))
dtJoined.Columns.Add("POPER", GetType(String))
dtJoined.Columns.Add("HSL", GetType(Decimal))
dtJoined.Columns.Add("LIFNR", GetType(String))
dtJoined.Columns.Add("NAME1", GetType(String))
dtJoined.Columns.Add("BUDAT", GetType(String))
dtJoined.Columns.Add("BLDAT", GetType(String))
dtJoined.Columns.Add("BLART", GetType(String))
dtJoined.Columns.Add("ENTERED_DATE", GetType(String))

Dim result = 
            (From balRow In dtBal.AsEnumerable() _
            Group Join dtlRow In dtDtl.AsEnumerable() _
            On New With {
                .BUKRS = balRow.Field(Of String)("BUKRS"),
                .RACCT = balRow.Field(Of String)("RACCT"),
                .KOSTL = balRow.Field(Of String)("KOSTL"),
                .PRCTR = balRow.Field(Of String)("PRCTR"),
                .RYEAR = balRow.Field(Of String)("RYEAR"),
                .POPER = balRow.Field(Of String)("POPER")
            } Equals New With {
                .BUKRS = dtlRow.Field(Of String)("BUKRS"),
                .RACCT = dtlRow.Field(Of String)("RACCT"),
                .KOSTL = dtlRow.Field(Of String)("KOSTL"),
                .PRCTR = dtlRow.Field(Of String)("PRCTR"),
                .RYEAR = dtlRow.Field(Of String)("RYEAR"),
                .POPER = dtlRow.Field(Of String)("POPER")
            } Into joinedData = Group _
            From joinedRecords In joinedData.DefaultIfEmpty() _
            Select New With {
                BUKRS = balRow.Field(Of String)("BUKRS"),
                RACCT = balRow.Field(Of String)("RACCT"),
                KOSTL = balRow.Field(Of String)("KOSTL"),
                PRCTR = balRow.Field(Of String)("PRCTR"),
                RYEAR = balRow.Field(Of String)("RYEAR"),
                POPER = balRow.Field(Of String)("POPER"),
                HSL = If(joinedRecords Is Nothing, balRow.Field(Of Decimal)("HSL"), joinedRecords.Field(Of Decimal)("HSL")),
                LIFNR = If(joinedRecords Is Nothing, " ", joinedRecords.Field(Of String)("LIFNR")),
                NAME1 = If(joinedRecords Is Nothing, " ", joinedRecords.Field(Of String)("NAME1")),
                BUDAT = If(joinedRecords Is Nothing, " ", joinedRecords.Field(Of String)("BUDAT")),
                BLDAT = If(joinedRecords Is Nothing, " ", joinedRecords.Field(Of String)("BLDAT")),
                BLART = If(joinedRecords Is Nothing, " ", joinedRecords.field(Of String)("BLART")),
                ENTERED_DATE = If(joinedRecords Is Nothing, balRow.Field(Of String)("ENTERED_DATE"), joinedRecords.Field(Of String)("ENTERED_DATE"))
            }
            ).Select(
                Function(x)
                    Dim row As DataRow = dtJoined.NewRow()
                    row("BUKRS") = x.BUKRS
                    row("RACCT") = x.RACCT
                    row("KOSTL") = x.KOSTL
                    row("PRCTR") = x.PRCTR
                    row("RYEAR") = x.RYEAR
                    row("POPER") = x.POPER
                    row("HSL") = x.HSL
                    row("LIFNR") = x.LIFNR
                    row("NAME1") = x.NAME1
                    row("BUDAT") = x.BUDAT
                    row("BLDAT") = x.BLDAT
                    row("BLART") = x.BLART
                    row("ENTERED_DATE") = x.ENTERED_DATE
                    Return row
                End Function
            )                            

我已经阅读了很多关于 Group Joins 和 LINQ 的帖子,但仍然无法正确使用语法。有人可以帮我解决我在这里缺少的东西吗?

谢谢

标签: .netvb.netlinq

解决方案


推荐阅读