Basta ya de indagar por todo internet porque has llegado al espacio justo, poseemos la respuesta que quieres hallar pero sin complicarte.
Solución:
Para las uniones, prefiero la sintaxis de consulta para todos los detalles que están felizmente ocultos (entre ellos, los identificadores transparentes involucrados con las proyecciones intermedias en el camino que son evidentes en el equivalente de sintaxis de puntos). Sin embargo, usted preguntó sobre Lambdas, que creo que tiene todo lo que necesita, solo necesita ponerlo todo 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
);
Si lo necesita, puede guardar la combinación en una variable local y reutilizarla más tarde; sin embargo, a falta de otros detalles, no veo ninguna razón para introducir la variable local.
Además, podrías tirar el Select
en la última lambda de la segunda Join
(nuevamente, siempre que no haya otras operaciones que dependan de los resultados de la unión) lo que daría:
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
);
… y haciendo un último intento de venderle la sintaxis de consulta, esto se vería así:
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
;
Sus manos pueden estar atadas sobre si la sintaxis de consulta está disponible. Sé que algunas tiendas tienen tales mandatos, a menudo basados en la noción de que la sintaxis de consulta es algo más limitada que la sintaxis de puntos. Hay otras razones, como “¿por qué debería aprender una segunda sintaxis si puedo hacer todo y más en la sintaxis de puntos?” Como muestra esta última parte, hay detalles que oculta la sintaxis de consulta que pueden hacer que valga la pena aceptarlo con la mejora de la legibilidad que aporta: todas esas proyecciones intermedias e identificadores que tiene que preparar felizmente no están al frente y al centro. etapa en la versión de sintaxis de consulta – son pelusa de fondo. Fuera de mi caja de jabón ahora, de todos modos, gracias por la pregunta. 🙂
Lo que has visto es lo que obtienes, y es exactamente lo que pediste, aquí:
(ppc, c) => new productproductcategory = ppc, category = c
Esa es una expresión lambda que devuelve un tipo anónimo con esas dos propiedades.
En sus Productos categorizados, solo necesita pasar por esas propiedades:
CategorizedProducts catProducts = query.Select(
m => new
ProdId = m.productproductcategory.product.Id,
CatId = m.category.CatId,
// other assignments
);
echa un vistazo a este código de muestra de mi proyecto
public static IList GetDepartmentLettersLinq(int departmentId)
IEnumerable allDepartmentLetters =
from allLetter in LetterService.GetAllLetters()
join allUser in UserService.GetAllUsers() on allLetter.EmployeeID equals allUser.ID into usersGroup
from user in usersGroup.DefaultIfEmpty()// here is the tricky part
join allDepartment in DepartmentService.GetAllDepartments() on user.DepartmentID equals allDepartment.ID
where allDepartment.ID == departmentId
select allLetter;
return allDepartmentLetters.ToArray();
en este código me uní a 3 tablas y respeté la condición de unión desde la cláusula where
nota: las clases de servicios simplemente están deformadas (encapsulan) las operaciones de la base de datos
Te mostramos comentarios y puntuaciones
Acuérdate de que te brindamos la opción de añadir un criterio correcto .