Für Joins bevorzuge ich nachdrücklich die Abfragesyntax für alle Details, die glücklich verborgen sind (nicht zuletzt die transparenten Bezeichner, die mit den Zwischenprojektionen auf dem Weg verbunden sind, die im Punktsyntaxäquivalent erkennbar sind). Sie haben jedoch nach Lambdas gefragt, von denen ich denke, dass Sie alles haben, was Sie brauchen - Sie müssen nur alles zusammenfügen.
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
});
Wenn nötig, können Sie den Join in einer lokalen Variablen speichern und später wiederverwenden. Da jedoch keine anderen Details vorliegen, sehe ich keinen Grund, die lokale Variable einzuführen.
Sie können das auch Select
in das letzte Lambda des zweiten werfen Join
(vorausgesetzt, es gibt keine anderen Operationen, die von den Verknüpfungsergebnissen abhängen), die Folgendes ergeben würden:
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
});
... und wenn Sie einen letzten Versuch unternehmen, Ihnen die Abfragesyntax zu verkaufen, würde dies folgendermaßen aussehen:
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
};
Möglicherweise sind Ihnen die Hände gebunden, ob die Abfragesyntax verfügbar ist. Ich weiß, dass einige Geschäfte solche Mandate haben - oft basierend auf der Vorstellung, dass die Abfragesyntax etwas eingeschränkter ist als die Punktsyntax. Es gibt andere Gründe, wie "Warum sollte ich eine zweite Syntax lernen, wenn ich alles und mehr in Punktsyntax tun kann?" Wie dieser letzte Teil zeigt, gibt es Details, die die Abfragesyntax verbirgt und die es wert sind, mit der damit verbundenen Verbesserung der Lesbarkeit in Betracht gezogen zu werden: Alle Zwischenprojektionen und Bezeichner, die Sie erstellen müssen, sind glücklicherweise nicht frontal und zentriert. Stufe in der Abfragesyntaxversion - sie sind Hintergrundflusen. Jetzt aus meiner Seifenkiste - jedenfalls danke für die Frage. :) :)