VB.Net LinQ-左外部联接多个表

时间:2019-11-28 13:36:26

标签: .net vb.net linq left-join

我需要知道如何使用Linq在VB.Net中保留多个表。

到目前为止我所拥有的:

Dim linqVorauswahl = (From e In ds.Tables("id_EAN")
                  Join gmpfr In ds.Tables("id_GetMatchingProductForIdResult") On e.Field(Of String)("id_EAN") Equals gmpfr.Field(Of String)("id_Id")
                  Join prods In ds.Tables("id_Products") On gmpfr.Field(Of Nullable(Of Int32))("id_GetMatchingProductForIdResult_Id") Equals prods.Field(Of Nullable(Of Int32))("id_GetMatchingProductForIdResult_Id")
                  Join prod In ds.Tables("id_Product") On prods.Field(Of Nullable(Of Int32))("id_Products_Id") Equals prod.Field(Of Nullable(Of Int32))("id_Products_Id")
                  Join ident In ds.Tables("id_Identifiers") On prod.Field(Of Nullable(Of Int32))("id_Product_Id") Equals ident.Field(Of Nullable(Of Int32))("id_Product_Id")
                  Join asinmp In ds.Tables("id_MarketplaceAsin") On ident.Field(Of Nullable(Of Int32))("id_Identifiers_Id") Equals asinmp.Field(Of Nullable(Of Int32))("id_Identifiers_Id")
                  Join attrSets In ds.Tables("id_AttributeSets") On ident.Field(Of Nullable(Of Int32))("id_Product_Id") Equals attrSets.Field(Of Nullable(Of Int32))("id_AttributeSets_Id")
                  Join itemAttr In ds.Tables("id_ItemAttributes") On attrSets.Field(Of Nullable(Of Int32))("id_AttributeSets_Id") Equals itemAttr.Field(Of Nullable(Of Int32))("id_AttributeSets_Id")
                  Join saleRankings In ds.Tables("id_SalesRankings") On prod.Field(Of Nullable(Of Int32))("id_Product_Id") Equals saleRankings.Field(Of Nullable(Of Int32))("id_Product_Id")
                  Join salesRank In ds.Tables("id_SalesRank") On saleRankings.Field(Of Nullable(Of Int32))("id_SalesRankings_Id") Equals salesRank.Field(Of Nullable(Of Int32))("id_SalesRankings_Id")
                  Where itemAttr.Field(Of String)("id_Binding") <> "Wine" And
                       itemAttr.Field(Of String)("id_Binding") <> "Lebensmittel & Getränke" And
                       itemAttr.Field(Of String)("id_Binding") <> "Product Bundle"
                  Select New With {
                  .asinMP = asinmp.Field(Of String)("id_MarketplaceId"),
                  .ean = e.Field(Of String)("id_EAN"),
                  .asin = asinmp.Field(Of String)("id_ASIN"),
                  .title = itemAttr.Field(Of String)("id_Title"),
                  .status = gmpfr.Field(Of String)("id_status"),
                  .binding = itemAttr.Field(Of String)("id_Binding"),
                  .rank = Convert.ToInt32(salesRank.Field(Of String)("id_Rank"))
                  }).ToArray

最后两个联接我需要离开外部联接,因为它们并不总是填充/可用。

Join saleRankings In ds.Tables("id_SalesRankings") On prod.Field(Of Nullable(Of Int32))("id_Product_Id") Equals saleRankings.Field(Of Nullable(Of Int32))("id_Product_Id")
Join salesRank In ds.Tables("id_SalesRank") On saleRankings.Field(Of Nullable(Of Int32))("id_SalesRankings_Id") Equals salesRank.Field(Of Nullable(Of Int32))("id_SalesRankings_Id")

您是否有解决此问题的简单方法?如果可能的话,在一个查询中。

1 个答案:

答案 0 :(得分:0)

解决方案:

Dim linqVorauswahl = (From e In ds.Tables("id_EAN")
                              Join gmpfr In ds.Tables("id_GetMatchingProductForIdResult") On e.Field(Of String)("id_EAN") Equals gmpfr.Field(Of String)("id_Id")
                              Join prods In ds.Tables("id_Products") On gmpfr.Field(Of Integer?)("id_GetMatchingProductForIdResult_Id") Equals prods.Field(Of Integer?)("id_GetMatchingProductForIdResult_Id")
                              Join prod In ds.Tables("id_Product") On prods.Field(Of Integer?)("id_Products_Id") Equals prod.Field(Of Integer?)("id_Products_Id")
                              Join ident In ds.Tables("id_Identifiers") On prod.Field(Of Integer?)("id_Product_Id") Equals ident.Field(Of Integer?)("id_Product_Id")
                              Join asinmp In ds.Tables("id_MarketplaceAsin") On ident.Field(Of Integer?)("id_Identifiers_Id") Equals asinmp.Field(Of Integer?)("id_Identifiers_Id")
                              Join attrSets In ds.Tables("id_AttributeSets") On ident.Field(Of Integer?)("id_Product_Id") Equals attrSets.Field(Of Integer?)("id_AttributeSets_Id")
                              Join itemAttr In ds.Tables("id_ItemAttributes") On attrSets.Field(Of Integer?)("id_AttributeSets_Id") Equals itemAttr.Field(Of Integer?)("id_AttributeSets_Id")
                              Group Join saleRankings In ds.Tables("id_SalesRankings") On prod.Field(Of Integer?)("id_Product_Id") Equals saleRankings.Field(Of Integer?)("id_Product_Id")
                                  Into g = Group
                              From eg In g.DefaultIfEmpty()
                              Group Join salesRank In ds.Tables("id_SalesRank") On eg.Field(Of Integer?)("id_SalesRankings_Id") Equals salesRank.Field(Of Integer?)("id_SalesRankings_Id")
                                  Into g2 = Group
                              From eg2 In g2.DefaultIfEmpty()
                              Where itemAttr.Field(Of String)("id_Binding") <> "Wine" And
                                   itemAttr.Field(Of String)("id_Binding") <> "Lebensmittel & Getränke" And
                                   itemAttr.Field(Of String)("id_Binding") <> "Product Bundle"
                              Select New With {
                              .asinMP = asinmp.Field(Of String)("id_MarketplaceId"),
                              .ean = e.Field(Of String)("id_EAN"),
                              .asin = asinmp.Field(Of String)("id_ASIN"),
                              .title = itemAttr.Field(Of String)("id_Title"),
                              .status = gmpfr.Field(Of String)("id_status"),
                              .binding = itemAttr.Field(Of String)("id_Binding"),
                              .rank = If(IsNothing(eg2), 999999, Convert.ToInt32(eg2.Field(Of String)("id_Rank")))
                              }).ToArray