我需要知道如何使用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")
您是否有解决此问题的简单方法?如果可能的话,在一个查询中。
答案 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