Vorgehensweise Join zwischen mehreren Tabellen in LINQ Lambda
Ich versuche, führen Sie eine Verknüpfung zwischen mehreren Tabellen in LINQ. Ich habe die folgenden Klassen:
Product {Id, ProdName, ProdQty}
Category {Id, CatName}
ProductCategory{ProdId, CatId} //association table
Und ich den folgenden code verwenden (wo product
category
und productcategory
sind Instanzen der oben genannten Klassen):
var query = product.Join(productcategory, p => p.Id, pc => pc.ProdID, (p, pc) => new {product = p, productcategory = pc})
.Join(category, ppc => ppc.productcategory.CatId, c => c.Id, (ppc, c) => new { productproductcategory = ppc, category = c});
Mit diesem code habe ich erhalten, ein Objekt der folgenden Klasse:
QueryClass { productproductcategory, category}
Wo producproductcategory Typ:
ProductProductCategoryClass {product, productcategory}
Verstehe ich nicht, wo die verknüpften "Tabelle" ist, erwartete ich eine einzelne Klasse enthält alle Eigenschaften, die von den beteiligten Klassen.
Mein Ziel ist, füllen Sie ein anderes Objekt mit einigen Eigenschaften ergeben sich aus der Abfrage:
CategorizedProducts catProducts = query.Select(m => new { m.ProdId = ???, m.CatId = ???, //other assignments });
wie kann ich dieses Ziel erreichen?
InformationsquelleAutor der Frage CiccioMiami | 2012-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für joins, die ich stark bevorzugen, query-syntax für alle details, die gerne ausgeblendet wird (nicht zuletzt von denen sind die transparente IDS beteiligt sich mit der intermediate-Projektionen entlang des Weges, die offensichtlich in der dot-syntax äquivalent). Aber, fragte Sie über Lambdas, die ich denke, Sie haben alles was Sie brauchen - Sie müssen nur um es alle zusammen.
Wenn Sie müssen, können Sie speichern Sie die Verknüpfung in eine lokale variable und die Wiederverwendung zu einem späteren Zeitpunkt, jedoch fehlen weitere Angaben, im Gegenteil, ich sehe keinen Grund für die Einführung der lokalen Variablen.
Außerdem könnten Sie werfen die
Select
in die Letzte lambda des zweitenJoin
(wieder, vorausgesetzt, es sind keine anderen Operationen, die abhängig von der join-Ergebnisse), die geben würde:...und machen einen letzten Versuch, Sie zu verkaufen Abfrage-syntax würde dies wie folgt Aussehen:
Ihre Hände werden gebunden auf, ob die Abfrage-syntax verfügbar ist. Ich kenne einige Läden haben solche Mandate - basiert oft auf der Vorstellung, dass die Abfrage-syntax ist etwas mehr begrenzt als die dot-syntax. Es gibt andere Gründe, wie "warum soll ich lernen eine zweite syntax, wenn ich kann alles tun und mehr in der dot-syntax?" Wie dieser Letzte Teil zeigt - es sind details, die Abfrage-syntax versteckt, die machen können, es lohnt sich umarmt mit der Verbesserung der Lesbarkeit es bringt: alle diejenigen, intermediate Projektionen und Kennungen, die Sie haben, um zu Kochen-gerne auch nicht-front-und-center-Bühne in der Abfrage-syntax-version - Sie sind hintergrund-fluff. Aus meiner soap-box-jetzt - jedenfalls, vielen Dank für die Frage. 🙂
InformationsquelleAutor der Antwort devgeezer
Was Sie gesehen haben, ist was Sie bekommen - und es ist genau das, was Sie gefragt haben, hier:
Das ist ein lambda-Ausdruck, der die Rückkehr eines anonymen Typs mit den beiden Eigenschaften.
In Ihrem CategorizedProducts, man muss nur über diejenigen Eigenschaften:
InformationsquelleAutor der Antwort Jon Skeet
schauen Sie auf dieses Beispiel-code von meinem Projekt
in diesem code kam ich 3 Tabellen und ich spited join-Bedingung aus der where-Klausel
Hinweis: das Services-Klassen sind nur verzogen(Kapseln), die Datenbank-Operationen
InformationsquelleAutor der Antwort Basheer AL-MOMANI
InformationsquelleAutor der Antwort saktiprasad swain
InformationsquelleAutor der Antwort Alex Martinez