Для объединений я настоятельно предпочитаю синтаксис запроса для всех деталей, которые удачно скрыты (не в последнюю очередь прозрачные идентификаторы, связанные с промежуточными проекциями на пути, которые очевидны в точечно-синтаксическом эквиваленте). Тем не менее, вы спросили о Лямбдах, которые, я думаю, у вас есть все, что вам нужно - вам просто нужно собрать все это вместе.
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
});
Если вам нужно, вы можете сохранить объединение в локальной переменной и использовать его позже, однако, не имея других подробностей, я не вижу причин вводить локальную переменную.
Кроме того, вы можете бросить Select
в последнюю лямбду второй Join
(опять же, при условии, что нет других операций, зависящих от результатов объединения), что даст:
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
});
... и последняя попытка продать вас по синтаксису запроса будет выглядеть так:
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
};
Ваши руки могут быть связаны с тем, доступен ли синтаксис запроса. Я знаю, что у некоторых магазинов есть такие полномочия - часто основанные на представлении, что синтаксис запросов несколько более ограничен, чем синтаксис точек. Есть и другие причины, например, «зачем мне изучать второй синтаксис, если я могу делать все и больше в точечном синтаксисе?» Как показывает эта последняя часть - есть детали, скрывающие синтаксис запроса, которые могут сделать его достойным внимания с улучшением читабельности, которое оно приносит: все эти промежуточные проекции и идентификаторы, которые вы должны подготовить, к счастью, не являются передними и центральными. этап в версии запроса-синтаксиса - это фоновый пух. С моего мыла сейчас - во всяком случае, спасибо за вопрос. :)