Pour les jointures, je préfère de loin la syntaxe des requêtes pour tous les détails qui sont heureusement cachés (notamment les identificateurs transparents impliqués dans les projections intermédiaires en cours de route qui sont apparents dans l'équivalent en syntaxe des points). Cependant, vous avez posé une question sur les Lambdas et je pense que vous avez tout ce qu'il vous faut - il vous suffit de les assembler.
var categorizedProducts = product
.Join(productcategory, p => p.Id, pc => pc.ProdId, (p, pc) => new { p, pc })
.Join(category, ppc => ppc.pc.CatId, c => c.Id, (ppc, c) => new { ppc, c })
.Select(m => new {
ProdId = m.ppc.p.Id, // or m.ppc.pc.ProdId
CatId = m.c.CatId
// other assignments
});
Si nécessaire, vous pouvez enregistrer la jointure dans une variable locale et la réutiliser ultérieurement. Cependant, en l'absence d'autres détails contraires, je ne vois aucune raison d'introduire la variable locale.
Vous pouvez également lancer la fonction Select
dans le dernier lambda du second Join
(encore une fois, à condition qu'il n'y ait pas d'autres opérations qui dépendent des résultats de la jointure), ce qui donnerait :
var categorizedProducts = product
.Join(productcategory, p => p.Id, pc => pc.ProdId, (p, pc) => new { p, pc })
.Join(category, ppc => ppc.pc.CatId, c => c.Id, (ppc, c) => new {
ProdId = ppc.p.Id, // or ppc.pc.ProdId
CatId = c.CatId
// other assignments
});
...et pour tenter une dernière fois de vous vendre la syntaxe des requêtes, cela ressemblerait à ceci :
var categorizedProducts =
from p in product
join pc in productcategory on p.Id equals pc.ProdId
join c in category on pc.CatId equals c.Id
select new {
ProdId = p.Id, // or pc.ProdId
CatId = c.CatId
// other assignments
};
Il se peut que vous n'ayez pas les mains libres pour déterminer si la syntaxe des requêtes est disponible. Je sais que certains ateliers ont de telles obligations - souvent fondées sur l'idée que la syntaxe de requête est un peu plus limitée que la syntaxe de point. Il y a d'autres raisons, comme "pourquoi devrais-je apprendre une deuxième syntaxe si je peux faire tout et plus dans la syntaxe pointée ?" Comme le montre cette dernière partie, il y a des détails que la syntaxe de requête cache et qui valent la peine d'être adoptés avec l'amélioration de la lisibilité qu'ils apportent : toutes ces projections intermédiaires et ces identificateurs que vous devez cuisiner ne sont heureusement pas au premier plan dans la version de la syntaxe de requête - ils sont en arrière-plan. Je quitte mon banc de savon maintenant - en tout cas, merci pour la question :)