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
相关产品推荐
相关产品推荐

