You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET无SQL无LINQ实现两个DataTable左连接的方法咨询

实现方案

完全基于内存原生API实现,不需要数据库连接、不需要SQL语句、不需要LINQ,核心通过字典映射+遍历匹配实现左连接逻辑,代码如下:

步骤1:定义结果表结构

Dim resultTable As New DataTable()
' 按需求添加5个输出字段
resultTable.Columns.Add("Order", GetType(Integer))
resultTable.Columns.Add("Account_Number", GetType(String))
resultTable.Columns.Add("Account_Name", GetType(String))
resultTable.Columns.Add("Line_Number", GetType(String))
resultTable.Columns.Add("Model", GetType(String))

步骤2:构建MyTable1的匹配映射字典

提前把MyTable1的订单号作为键存入字典,避免后续匹配时重复遍历MyTable1,提升执行效率:

Dim orderMapping As New Dictionary(Of Integer, DataRow)
For Each row As DataRow In MyTable1.Rows
    Dim orderId As Integer = CInt(row("Order"))
    ' 避免重复键报错,相同Order默认取第一条数据
    If Not orderMapping.ContainsKey(orderId) Then
        orderMapping.Add(orderId, row)
    End If
Next

步骤3:遍历MyTable2填充结果表

遵循左连接规则,保留MyTable2所有行,匹配到MyTable1数据则填充对应字段,未匹配则赋值为空:

For Each row2 As DataRow In MyTable2.Rows
    Dim newResultRow As DataRow = resultTable.NewRow()
    Dim currentOrderNum As Integer = CInt(row2("Order_Number"))
    
    ' 填充固定字段
    newResultRow("Order") = currentOrderNum
    newResultRow("Line_Number") = row2("Line_Number")
    newResultRow("Model") = row2("Model")
    
    ' 匹配MyTable1字段
    If orderMapping.ContainsKey(currentOrderNum) Then
        Dim matchedRow1 = orderMapping(currentOrderNum)
        newResultRow("Account_Number") = matchedRow1("Account_Number")
        newResultRow("Account_Name") = matchedRow1("Account_Name")
    Else
        ' 未匹配到的关联字段赋值为数据库空值
        newResultRow("Account_Number") = DBNull.Value
        newResultRow("Account_Name") = DBNull.Value
    End If
    
    resultTable.Rows.Add(newResultRow)
Next

注意:如果你的Order和Order_Number字段是字符串类型,把字典的键类型改为String,删除CInt转换即可。

最终得到的resultTable就是你需要的左连接结果表。


内容的提问来源于stack exchange,提问作者Rodney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:54:05