Left join using Linq C #

5

I have the person table in which there are 100 people of which 80 are students, of those 80 only 50 are enrolled, I try to make a left join (Sql Server) to show me the student that exists, even if not are enrolled

The table that stores the course information, parallel, shift is MATRICULA

var persona = (from p in db.Persona                                             // cantidad de Personas _________________________ 100
                join co in db.Colegio on p.CodColegio equals co.IdColegio        
                join al in db.Alumno on p.CodPersona equals al.CodPersona        // cantidad de personas que son alumnos___________ 80

                join ma in db.Matricula on al.CodAlumno equals ma.CodAlumno      // cantidad de añumnos que estan matriculados ___  50

                join cu in db.Curso on ma.CodCurso equals cu.CodCurso            // los _ 50 _ tienen curso asignado
                join pa in db.Paralelo on ma.CodParalelo equals pa.CodParalelo   // los _ 50 _ tienen paralelo asignado
                join tu in db.Turno on ma.CodTurno equals tu.CodTurno            // los _ 50 _ tienen turno asignado

                where p.NombreCompleto.ToUpper().Replace(" ", string.Empty) == nombre.ToUpper().Replace(" ", string.Empty)

                select new
                {
                    CodPersona       = p.CodPersona,
                    NombreCompleto   = p.NombreCompleto,

                    CodColegio       = p.CodColegio,
                    colegio          = co.Nombre,

                    curso            = cu.Descripcion,
                    paralelo         = pa.Descripcion,
                    turno            = tu.Descripcion
                }).FirstOrDefault();
    
asked by Rodrigo Rodriguez 30.12.2018 в 19:18
source

2 answers

3

With the DefaultIfEmpty() method you can do a left join, I'll give you an example with Persona and Colegio

from p in db.Persona 
join co in db.Colegio on p.CodColegio equals co.IdColegio into PersonasColegio
from pco in PersonasColegio.DefaultIfEmpty()
select new {
    //lo que quieras seleccionar
}
    
answered by 30.12.2018 в 23:44
0

I think you can do this

var query = (from p in db.Persona                                             // cantidad de Personas _________________________ 100
        join co in db.Colegio on p.CodColegio equals co.IdColegio
           into PersonaColegio
        from pc in PersonaColegio.DefaultIfEmpty() // LEFT JOIN
        join al in db.Alumno on p.CodPersona equals al.CodPersona        // cantidad de personas que son alumnos___________ 80

        join ma in db.Matricula on al.CodAlumno equals ma.CodAlumno      // cantidad de añumnos que estan matriculados ___  50

        join cu in db.Curso on ma.CodCurso equals cu.CodCurso            // los _ 50 _ tienen curso asignado
        join pa in db.Paralelo on ma.CodParalelo equals pa.CodParalelo   // los _ 50 _ tienen paralelo asignado
        join tu in db.Turno on ma.CodTurno equals tu.CodTurno            // los _ 50 _ tienen turno asignado

        where p.NombreCompleto.ToUpper().Replace(" ", string.Empty) == nombre.ToUpper().Replace(" ", string.Empty)

        select new
        {
            codPersona = p.CodPersona,
            nombreCompleto = p.NombreCompleto,

            codColegio = p.CodColegio,
            colegio = pc.Nombre,

            curso = cu.Descripcion,
            paralelo = pa.Descripcion,
            turno = tu.Descripcion
        });

-------- SQL Query

 SELECT
     [Extent1].[CodColegio] AS[CodColegio], 
     [Extent1].[CodPersona] AS[CodPersona], 
     [Extent1].[NombreCompleto] AS[NombreCompleto], 
     [Extent2].[Nombre] AS[Nombre], 
     [Extent5].[Descripcion] AS[Descripcion], 
     [Extent6].[Descripcion] AS[Descripcion1], 
     [Extent7].[Descripcion]
         AS[Descripcion2]
 FROM[dbo].[Personas]
         AS[Extent1]
 LEFT OUTER JOIN[dbo].[Colegios] AS[Extent2] ON[Extent1].[CodColegio] = [Extent2].[IdColegio]
         INNER JOIN[dbo].[Alumnoes] AS[Extent3] ON[Extent1].[CodPersona] = [Extent3].[CodPersona]
         INNER JOIN[dbo].[Matriculas] AS[Extent4] ON[Extent3].[CodAlumno] = [Extent4].[CodAlumno]
         INNER JOIN[dbo].[Cursoes] AS[Extent5] ON[Extent4].[CodCurso] = [Extent5].[CodCurso]
         INNER JOIN[dbo].[Paraleloes] AS[Extent6] ON[Extent4].[CodParalelo] = [Extent6].[CodParalelo]
         INNER JOIN[dbo].[Turnoes] AS[Extent7] ON[Extent4].[CodTurno] = [Extent7].[CodTurno]
         WHERE((REPLACE(UPPER([Extent1].[NombreCompleto]), N' ', @p__linq__0)) = (REPLACE(UPPER(@p__linq__1), N' ', @p__linq__2))) OR((REPLACE(UPPER([Extent1].[NombreCompleto]), N' ', @p__linq__0) IS NULL) AND(REPLACE(UPPER(@p__linq__1), N' ', @p__linq__2) IS NULL))
    
answered by 03.01.2019 в 06:45