Vb.net 左外连接两个数据表?

Vb.net 左外连接两个数据表?,vb.net,linq,Vb.net,Linq,是否可以修改此LINQ方法以执行左外部联接?看着LINQ的询问,我有点不知所措 Private Function MergeTables(Of T)(ByVal dtForecast As DataTable, ByVal dtDns As DataTable, _ ByVal fieldASelector As Func(Of DataRow, T), _

是否可以修改此LINQ方法以执行左外部联接?看着LINQ的询问,我有点不知所措

Private Function MergeTables(Of T)(ByVal dtForecast As DataTable, 
                                 ByVal dtDns As DataTable, _
                                 ByVal fieldASelector As Func(Of DataRow, T), _
                                 ByVal fieldBSelector As Func(Of DataRow, T), _
                                 ByVal whereClauseA As Func(Of DataRow, Decimal), _
                                 ByVal whereClauseB As Func(Of DataRow, Decimal))
  Dim test = (From forecast In dtForecast.AsEnumerable() Join dns In dtDns.AsEnumerable() _
              On fieldASelector(forecast) Equals fieldBSelector(dns) _
              Where whereClauseA(forecast) <> 0 And whereClauseB(dns) <> 0 _
            Select New With _
                { _
                    .ProductId = forecast.Field(Of String)("ProductID"), _
                    .Product = forecast.Field(Of String)("ProductName"), _
                    .Account = forecast.Field(Of String)("Account"), _
                    .BrandName = forecast.Field(Of String)("BrandName"), _
                    .CorrugateCost = forecast.Field(Of Decimal)("Corrugate_Cost"), _
                    .f_m1 = forecast.Field(Of Decimal)("f_m1"), _
                    .a_m1 = dns.Field(Of Decimal)("a_m1"), _
                    .f_m2 = forecast.Field(Of Decimal)("f_m2"), _
                    .a_m2 = dns.Field(Of Decimal)("a_m2"), _
                    .f_m3 = forecast.Field(Of Decimal)("f_m3"), _
                    .a_m3 = dns.Field(Of Decimal)("a_m3"), _
                    .f_m4 = forecast.Field(Of Decimal)("f_m4"), _
                    .a_m4 = dns.Field(Of Decimal)("a_m4"), _
                    .f_m5 = forecast.Field(Of Decimal)("f_m5"), _
                    .a_m5 = dns.Field(Of Decimal)("a_m5"), _
                    .f_m6 = forecast.Field(Of Decimal)("f_m6"), _
                    .a_m6 = dns.Field(Of Decimal)("a_m6"), _
                    .f_m7 = forecast.Field(Of Decimal)("f_m7"), _
                    .a_m7 = dns.Field(Of Decimal)("a_m7"), _
                    .f_m8 = forecast.Field(Of Decimal)("f_m8"), _
                    .a_m8 = dns.Field(Of Decimal)("a_m8"), _
                    .f_m9 = forecast.Field(Of Decimal)("f_m9"), _
                    .a_m9 = dns.Field(Of Decimal)("a_m9"), _
                    .f_m10 = forecast.Field(Of Decimal)("f_m10"), _
                    .a_m10 = dns.Field(Of Decimal)("a_m10"), _
                    .f_m11 = forecast.Field(Of Decimal)("f_m11"), _
                    .a_m11 = dns.Field(Of Decimal)("a_m11"), _
                    .f_m12 = forecast.Field(Of Decimal)("f_m12"), _
                    .a_m12 = dns.Field(Of Decimal)("a_m12"), _
                    .f_total = forecast.Field(Of Decimal)("f_total"), _
                    .a_total = dns.Field(Of Decimal)("a_total") _
                }).ToList()

        Return test
    End Function
私有函数MergeTables(Of T)(ByVal dtForecast As DataTable,
ByVal dtDns作为数据表_
ByVal字段选择器作为Func(数据行的T)_
ByVal fieldBSelector As Func(属于数据行,T)_
ByVal,其中子句A作为Func(数据行的小数)_
ByVal,其中B为Func(属于数据行,十进制))
Dim test=(从dtForecast.AsEnumerable()中的预测加入dtDns.AsEnumerable()中的dns)_
字段选择器(预测)等于字段选择器(dns)_
其中whereClauseA(预测)0和whereClauseB(dns)0_
选择“新建”_
{ _
.ProductId=forecast.Field(字符串)(“ProductId”)_
.Product=forecast.Field(字符串)(“产品名称”)_
.Account=预测.Field(字符串)(“Account”)_
.BrandName=forecast.Field(字符串)(“BrandName”)_
.CorrugateCost=预测.Field(十进制)(“瓦楞成本”)_
.f_m1=预测.Field(十进制)(“f_m1”)_
.a_m1=dns.字段(十进制)(“a_m1”)_
.f_m2=预测.Field(十进制)(“f_m2”)_
.a_m2=dns.字段(十进制)(“a_m2”)_
.f_m3=预测字段(十进制)(“f_m3”)_
.a_m3=dns.字段(十进制)(“a_m3”)_
.f_m4=预测.Field(十进制)(“f_m4”)_
.a_m4=dns.字段(十进制)(“a_m4”)_
.f_m5=预测.Field(十进制)(“f_m5”)_
.a_m5=dns.Field(十进制)(“a_m5”)_
.f_m6=预测.Field(十进制)(“f_m6”)_
.a_m6=dns.字段(十进制)(“a_m6”)_
.f_m7=预测.Field(十进制)(“f_m7”)_
.a_m7=dns.字段(十进制)(“a_m7”)_
.f_m8=预测.Field(十进制)(“f_m8”)_
.a_m8=dns.字段(十进制)(“a_m8”)_
.f_m9=预测.Field(十进制)(“f_m9”)_
.a_m9=dns.字段(十进制)(“a_m9”)_
.f_m10=预测.Field(十进制)(“f_m10”)_
.a_m10=dns.字段(十进制)(“a_m10”)_
.f_m11=预测.Field(十进制)(“f_m11”)_
.a_m11=dns.Field(十进制)(“a_m11”)_
.f_m12=预测.Field(十进制)(“f_m12”)_
.a_m12=dns.字段(十进制)(“a_m12”)_
.f_总计=预测字段(十进制)(“f_总计”)_
.a_总计=dns.字段(十进制)(“a_总计”)_
})托利斯先生()
回归试验
端函数

使用以下对查询的修改来执行
左侧外部联接

    From forecast In dtForecast.AsEnumerable() Group Join dns In dtDns.AsEnumerable() _
    On fieldASelector(forecast) Equals fieldBSelector(dns) Into JoinTable = Group _
    From dns in JoinTable.DefaultIfEmpty()_
    Where whereClauseA(forecast) <> 0 And whereClauseB(dns) <> 0 _
来自dtForecast.AsEnumerable()中的预测组加入dtDns.AsEnumerable()中的dns_
On fieldASelector(预测)等于fieldBSelector(dns)Into JoinTable=组_
来自JoinTable.DefaultIfEmpty()中的dns_
其中whereClauseA(预测)0和whereClauseB(dns)0_

我建议使用此资源帮助您使用LINQ:。(特别是对于这个问题,请转到“LINQ查询示例”>“连接运算符”>)

您可以使用
组连接
+
DefaultIfEmpty

Dim joined = From forecast In dtForecast.AsEnumerable()
             Group Join dns In dtDns.AsEnumerable()
             On fieldASelector(forecast) Equals fieldBSelector(dns) Into Group
             From x In Group.DefaultIfEmpty
             Where whereClauseA(forecast) <> 0 And whereClauseB(dns) <> 0
             Select New With
              {
                 .ProductId = forecast.Field(Of String)(ProductID),
                 .a_m2 = If(x Is Nothing, New Nullable(Of Decimal), x.Field(Of Decimal)("a_m2"))
              }
Dim joined=来自dtForecast.AsEnumerable()中的预测
dtDns.AsEnumerable()中的组加入dns
On fieldASelector(预测)等于fieldBSelector(dns)进入组
从组中的x开始。DefaultIfEmpty
其中whereClauseA(预测)0和whereClauseB(dns)0
选择“新建”
{
.ProductId=预测.Field(字符串的)(ProductId),
.a_m2=如果(x为零,新的可为零(十进制),x.字段(十进制)(“a_m2”))
}