Para junções, eu prefiro fortemente a sintaxe de consulta para todos os detalhes que ficam ocultos (não menos importante dos quais são os identificadores transparentes envolvidos com as projeções intermediárias ao longo do caminho que são aparentes no equivalente de sintaxe de ponto). No entanto, você perguntou sobre Lambdas, eu acho que você tem tudo o que precisa - você só precisa colocar tudo junto.
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
});
Se necessário, você pode salvar a junção em uma variável local e reutilizá-la mais tarde; porém, na falta de outros detalhes ao contrário, não vejo razão para introduzir a variável local.
Além disso, você poderia lançar o Select
no último lambda do segundo Join
(novamente, desde que não haja outras operações que dependam dos resultados da junção) que daria:
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
});
... e fazendo uma última tentativa de convencê-lo da sintaxe de consulta, ficaria assim:
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
};
Suas mãos podem estar atadas quanto à disponibilidade de sintaxe de consulta. Eu sei que algumas lojas têm tais mandatos - muitas vezes com base na noção de que a sintaxe de consulta é um pouco mais limitada do que a sintaxe de ponto. Existem outras razões, como "por que devo aprender uma segunda sintaxe se posso fazer tudo e muito mais na sintaxe de pontos?" Como mostra esta última parte - há detalhes que a sintaxe de consulta oculta que podem fazer valer a pena abraçar com a melhoria da legibilidade que ela traz: todas as projeções intermediárias e identificadores que você precisa preparar felizmente não são front-and-center- estágio na versão de sintaxe de consulta - eles são fluff de fundo. Fora da minha caixa de sabão agora - de qualquer forma, obrigado pela pergunta. :)