Comment effectuer une Jointure entre plusieurs tables dans LINQ lambda
Je suis en train d'effectuer une Jointure entre plusieurs tables dans LINQ. J'ai les classes suivantes:
Product {Id, ProdName, ProdQty}
Category {Id, CatName}
ProductCategory{ProdId, CatId} //association table
Et j'utilise le code suivant (où product
, category
et productcategory
sont des instances de classes ci-dessus):
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});
Avec ce code je obtenir un objet de la classe suivante:
QueryClass { productproductcategory, category}
Où producproductcategory est de type:
ProductProductCategoryClass {product, productcategory}
Je ne comprends pas où l'a rejoint à "la table", je m'attendais à un classe unique qui contient toutes les propriétés de la classe.
Mon but est de remplir un objet avec des propriétés résultant de la requête:
CategorizedProducts catProducts = query.Select(m => new { m.ProdId = ???, m.CatId = ???, //other assignments });
comment puis-je atteindre cet objectif?
- Je ne comprends pas...pourquoi m.ProdId = ??? au lieu de prodId = m.ProdId?
- Parce que je ne sais pas à l'avance comment naviguer et obtenir ProdId
Vous devez vous connecter pour publier un commentaire.
Pour les jointures, je préfère largement à la requête de la syntaxe de tous les détails qui sont heureusement caché (et non la moindre, est la transparence des identificateurs impliqués avec l'intermédiaire des projections le long de la voie qui sont manifestes dans la dot-syntaxe équivalente). Cependant, vous avez demandé concernant les Lambdas qui, je pense, vous avez tout ce dont vous avez besoin, vous avez juste besoin de mettre tout cela ensemble.
Si vous le souhaitez, vous pouvez enregistrer le rejoindre dans une variable locale et de la réutiliser plus tard, cependant, ne disposent pas d'autres détails au contraire, je ne vois pas de raison d'introduire la variable locale.
Aussi, vous pouvez jeter le
Select
dans la dernière lambda de la deuxièmeJoin
(encore une fois, il n'existe pas d'autres opérations qui dépendent de la jointure des résultats) qui donnerait:...et de faire une dernière tentative pour vous vendre sur la syntaxe de la requête, ce serait ressembler à ceci:
Vos mains peut être liée qu'à la requête de la syntaxe est disponible. Je sais que certains magasins ont de tels mandats - souvent basée sur la notion que la requête-la syntaxe est un peu plus limitée que la dot de la syntaxe. Il y a d'autres raisons, comme "pourquoi devrais-je apprendre une deuxième syntaxe si je peux tout faire et en plus dot-syntaxe?" Comme cette dernière partie montre - il y a des détails que la requête de la syntaxe cache que peut-il bien faire en vaut embrassant avec l'amélioration de la lisibilité qu'il apporte: tous ceux intermédiaire des projections et des identifiants que vous avez à faire cuire jusqu'sont heureusement pas en avant et le centre de la scène dans la requête-la syntaxe de la version de elles sont fond de peluches. Mon savon-boite - en tout cas, merci pour la question. 🙂
JOIN
déclaration? Comment faisons-nous cela? Par exemple, dans lejoin pc in productcategory on p.Id equals pc.ProdId
ligne, nous avons besoin d'ajouterand p.Id == 1
.p.Id == 1
depuis plus d'un où-filtre que c'est un des critères de jointure. La façon dont vous souhaitez faire une jointure sur plus d'un des critères est généralement d'utiliser un type anonyme:join pc in productcategory on new { Id = p.Id, Other = p.Other } equals new { Id = pc.ProdId, Other = pc.Other }
. Cela fonctionne dans Linq-to-Objets, et je suppose que la même volonté de travailler avec les requêtes de base de données ainsi. Avec des Bases de données, vous pourriez être en mesure de renoncer compliqué requêtes de jointure en définissant les clés étrangères comme approprié et d'accès aux données par le biais des biens.Ce que vous avez vu est ce que vous obtenez - et c'est exactement ce que vous avez demandé, ici:
C'est une lambda expression renvoyant un type anonyme avec ces deux propriétés.
Dans votre CategorizedProducts, vous avez juste besoin d'aller par le biais de ces propriétés:
CatId
fonctionne très bien. PourProdId
il devrait êtrem.productproductcategory.product.Id
OUm.productproductcategory.productcategory.ProdId
. Les deux attributions diffèrent, c'est d'abord sur le produit (joint avecproductcategory
) la deuxième est avecproductcategory
rejoint avec deuxproduct
etcategory
. - Vous suivez mon raisonnement?prendre regardez cet exemple de code à partir de mon projet
dans ce code, je l'ai rejoint, 3 tables et je spited condition de jointure de clause where
remarque: les Services des classes sont warped(encapsuler) les opérations de base de données
il a été un moment mais ma réponse peut aider quelqu'un:
si vous avez déjà défini la relation correctement, vous pouvez utiliser ceci: