.net - .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 的帖子,但仍然无法正确使用语法。有人可以帮我解决我在这里缺少的东西吗?
谢谢
解决方案
推荐阅读
- c# - .net核心多页表单不在会话中存储数据
- python - 升级到 Django 3.1.2
- swift - 核心数据的独特价值 swift
- python - 装饰器可以修改包装函数的函数签名中的类型提示吗?
- c++ - 尝试使用 malloc() 分配一个内部包含一个集合的结构来堆内存
- css - 使用 CSS 对齐字段
- java - Spring Data 中的验证抛出 ConstraintViolationException
- android - Android - 签名证书与上传证书
- git - 如何将一个分支的所有文件合并到另一个分支,但一个文件除外
- php - 找到没有打开 XAMPP 的文件 htdocs