Saltar al contenido

Cómo realizar la unión entre varias tablas en LINQ lambda

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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *