Take a look at below example:
#Region "sample data creation"
im dt1 As DataTable = New DataTable()
Dim dt2 As DataTable = New DataTable()
dt1.Columns.AddRange(New DataColumn() _
{ _
New DataColumn("SC", Type.GetType("System.Int32")), _
New DataColumn("SUB", Type.GetType("System.String")), _
New DataColumn("EXM", Type.GetType("System.String")) _
})
dt1.Rows.Add(New Object(){1, "1449-2", "AB101"})
dt1.Rows.Add(New Object(){1, "1449-2", "AC066"})
dt1.Rows.Add(New Object(){17, "1449-2", "AD071"})
dt1.Rows.Add(New Object(){37, "1449-3", "AD073"})
dt2.Columns.AddRange(New DataColumn() _
{ _
New DataColumn("IC", Type.GetType("System.Int32")), _
New DataColumn("SUB", Type.GetType("System.String")), _
New DataColumn("EXM", Type.GetType("System.String")) _
})
dt2.Rows.Add(New Object(){5, "1449-2", "AB101"})
dt2.Rows.Add(New Object(){4, "1449-2", "AC066"})
dt2.Rows.Add(New Object(){2, "1449-2", "AD071"})
dt2.Rows.Add(New Object(){21, "1449-2", "CD028"})
#End Region
Dim resultdt As DataTable = New DataTable()
resultdt.Columns.AddRange(New DataColumn() _
{ _
New DataColumn("IC", Type.GetType("System.Int32")), _
New DataColumn("SC", Type.GetType("System.Int32")), _
New DataColumn("SUB", Type.GetType("System.String")), _
New DataColumn("EXM", Type.GetType("System.String")) _
})
For Each dr2 As DataRow In dt2.Rows
Dim rr As DataRow = resultdt.NewRow
For Each dc As DataColumn In dt2.Columns
rr(dc.ColumnName) = dr2(dc.ColumnName)
Next dc
Dim result = dt1.AsEnumerable() _
.Where(Function(x) x("SUB") = dr2("SUB") And x("EXM") = dr2("EXM")) _
.Select(Function(x) x("SC")) _
.SingleOrDefault()
rr("SC") = If(result = Nothing, 0, result)
resultdt.Rows.Add(rr)
Next dr2
Dim missingRows = dt1.AsEnumerable() _
.Where(Function(x) resultdt.AsEnumerable().Any(Function(y) x("SUB") <> y("SUB") And x("EXM") <> y("EXM"))) _
.ToList()
For Each rr As DataRow In missingRows
resultdt.Rows.Add(New Object(){0, rr("SC"), rr("SUB"), rr("EXM")})
Next rr