2014-01-20 171 views
0

是否有可能修改此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 

回答

1

您可以使用Group Join + 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")) 
       } 
1

使用以下修改您的查詢perfom Left Outer Join

我推薦使用這一資源來幫助您使用LINQ:101 LINQ Samples。 (專門針對這個問題,去 「LINQ查詢樣品」> 「連接運算符」>Left Outer Join