Pour les jointures, je préfère fortement la syntaxe de requête pour tous les détails qui sont heureusement cachés (dont les identifiants transparents impliqués dans les projections intermédiaires en cours de route qui sont apparents dans l'équivalent de syntaxe de point). Cependant, vous avez demandé à propos de Lambdas que je pense que vous avez tout ce dont vous avez besoin - il vous suffit de tout mettre ensemble.
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 vous en avez besoin, vous pouvez enregistrer la jointure dans une variable locale et la réutiliser plus tard, mais en l'absence d'autres détails au contraire, je ne vois aucune raison d'introduire la variable locale.
De plus, vous pouvez lancer le Select
dans le dernier lambda de la seconde 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 faire une dernière tentative pour vous vendre sur la syntaxe de requête, 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
};
Vos mains peuvent être liées sur la disponibilité de la syntaxe de requête. Je sais que certains magasins ont de tels mandats - souvent basés sur la notion que la syntaxe de requête est un peu plus limitée que la syntaxe à points. Il y a d'autres raisons, comme "pourquoi devrais-je apprendre une deuxième syntaxe si je peux tout faire et plus en syntaxe à points?" Comme le montre cette dernière partie - il y a des détails que la syntaxe de requête cache qui peuvent valoir la peine d'être embrassés avec l'amélioration de la lisibilité qu'elle apporte: toutes ces projections et identificateurs intermédiaires que vous devez préparer ne sont heureusement pas au centre. étape dans la version de syntaxe de requête - ce sont des peluches d'arrière-plan. De ma boîte à savon maintenant - de toute façon, merci pour la question. :)