Query with Linq to Entities in many-to-many relationship

0

I have the following tables in a database:

The TeacherCourses table joins the many-to-many relationship between the Courses and Teachers tables.

I have been trying for a long time to make a query with Linq to Entities that returns all courses that a teacher teaches classes and all the teachers that teach classes in a course, but I have only got wrong results.

    
asked by anonymous 23.12.2016 / 01:50

1 answer

2

Well, abstracting the database and simplifying the types, leaving only the answer essential, so as not to complicate, I think the solution looks something like this:

public class Curso
{
    public string Nome { get; set; }
    public int ID { get; set; }

    public Curso ( int id, string nome )
    {
        ID = id;
        Nome = nome;
    }
}

public class Professor
{
    public string Nome { get; set; }
    public int ID { get; set; }

    public Professor(int id, string nome)
    {
        ID = id;
        Nome = nome;
    }
}

public class CursosProfessores
{
    public CursosProfessores(Professor professor, Curso curso)
    {
        ProfessorID = professor.ID;
        CursoID = curso.ID;
    }

    public int ProfessorID { get; }
    public int CursoID { get; }
}

static class Program
{
    //representa a tabela CursosProfessores
    static List<CursosProfessores> cursosProfessores = new List<CursosProfessores> ( );
    //representa a tabela Professores
    static Dictionary<int, Professor> professores = new Dictionary<int, Professor> ( );
    //representa a table Cursos
    static Dictionary<int, Curso> cursos = new Dictionary<int, Curso> ( );

    public static List<Professor> ProfessoresDeUmCurso(Curso curso)
    {
        var result = from cp in cursosProfessores from p in professores where curso.ID == cp.CursoID && p.Key == cp.ProfessorID select p.Value;
        return result.ToList ( );
    }

    public static List<Curso> CursosDeUmProfessor(Professor professor)
    {
        var result = from cp in cursosProfessores from c in cursos where professor.ID == cp.ProfessorID && c.Key == cp.CursoID select c.Value;
        return result.ToList ( );
    }
}

I did a test program, populating the data structures that simulate the tables (which gave a lot more work than writing the solution) and seems to work. Add these methods to the Program class and run more tests if you want:

    static void Main ( string[] args )
    {
        inicializar ( );

        Curso matematica = (from c in cursos where c.Value.Nome == "Matemática" select c.Value).Single();

        //esperados: arquimedes, einstein e gauss;
        List<Professor> professoresDeMatematica = ProfessoresDeUmCurso ( matematica );

        Console.WriteLine ( "Lista dos professores do curso de Matemática: " );
        foreach ( var p in professoresDeMatematica )
        {
            Console.WriteLine ( "\t" + p.Nome );
        }

        Curso fisica = ( from c in cursos where c.Value.Nome == "Física" select c.Value ).Single ( );

        //esperados: arquimedes, boyle, einstein, faraday, gauss e hawking;
        List<Professor> professoresDeFisica = ProfessoresDeUmCurso ( fisica );

        Console.WriteLine ( "\nLista dos professores do curso de Física: " );
        foreach ( var p in professoresDeFisica )
        {
            Console.WriteLine ( "\t" + p.Nome );
        }

        Professor gauss = ( from p in professores where p.Value.Nome == "Carl F. Gauss" select p.Value ).Single ( );

        //esperados: matemática, física, e astronomia;
        List<Curso> cursosDeGauss = CursosDeUmProfessor ( gauss );

        Console.WriteLine ( "\nLista dos cursos ministrados por Carl Friedrich Gauß: " );
        foreach ( var c in cursosDeGauss )
        {
            Console.WriteLine ( "\t" + c.Nome );
        }

        Professor chomsky = ( from p in professores where p.Value.Nome == "Noam Chomsky" select p.Value ).Single ( );

        //esperados: linguística, psicologia, e filosofia;
        List<Curso> cursosDeChomsky = CursosDeUmProfessor ( chomsky );

        Console.WriteLine ( "\nLista dos cursos ministrados por Noam Chomsky: " );
        foreach ( var c in cursosDeChomsky )
        {
            Console.WriteLine ( "\t" + c.Nome );
        }

        Console.ReadLine ( );
    }

    static void inicializar()
    {
        Professor arquimedes = new Professor ( 1, "Arquimedes de Siracusa" );
        Professor boyle = new Professor ( 2, "Robert Boyle" );
        Professor chomsky = new Professor ( 3, "Noam Chomsky" );
        Professor darwin = new Professor ( 4, "Charles Darwin" );
        Professor einstein = new Professor ( 5, "Albert Einstein" );
        Professor faraday = new Professor ( 6, "Michael Faraday" );
        Professor gauss = new Professor ( 7, "Carl F. Gauss" );
        Professor hawking = new Professor ( 8, "Stephen Hawking" );
        Professor ibsen = new Professor ( 9, "Henrik Ibsen" );
        Professor joyce = new Professor ( 10, "James Joyce" );
        Professor koch = new Professor ( 11, "Robert Koch" );
        Professor lacan = new Professor ( 12, "Jacques Lacan" );

        professores.Add ( arquimedes.ID, arquimedes );
        professores.Add ( boyle.ID, boyle );
        professores.Add ( chomsky.ID, chomsky );
        professores.Add ( darwin.ID, darwin );
        professores.Add ( einstein.ID, einstein );
        professores.Add ( faraday.ID, faraday );
        professores.Add ( gauss.ID, gauss );
        professores.Add ( hawking.ID, hawking );
        professores.Add ( ibsen.ID, ibsen );
        professores.Add ( joyce.ID, joyce );
        professores.Add ( koch.ID, koch );
        professores.Add ( lacan.ID, lacan );

        Curso matematica = new Curso ( 1, "Matemática" );
        Curso fisica = new Curso ( 2, "Física" );
        Curso quimica = new Curso ( 3, "Química" );
        Curso engenharia = new Curso ( 4, "Engenharia" );
        Curso astronomia = new Curso ( 5, "Astronomia" );
        Curso linguistica = new Curso ( 6, "Linguística" );
        Curso biologia = new Curso ( 7, "Biologia" );
        Curso psicologia = new Curso ( 8, "Psicologia" );
        Curso filosofia = new Curso ( 9, "Filosofia" );
        Curso literatura = new Curso ( 10, "Literatura" );

        cursos.Add ( matematica.ID, matematica );
        cursos.Add ( fisica.ID, fisica );
        cursos.Add ( quimica.ID, quimica );
        cursos.Add ( engenharia.ID, engenharia );
        cursos.Add ( astronomia.ID, astronomia );
        cursos.Add ( linguistica.ID, linguistica );
        cursos.Add ( biologia.ID, biologia );
        cursos.Add ( psicologia.ID, psicologia );
        cursos.Add ( filosofia.ID, filosofia );
        cursos.Add ( literatura.ID, literatura );

        cursosProfessores.Add ( new CursosProfessores ( arquimedes, matematica ) );
        cursosProfessores.Add ( new CursosProfessores ( arquimedes, fisica ) );
        cursosProfessores.Add ( new CursosProfessores ( arquimedes, engenharia ) );
        cursosProfessores.Add ( new CursosProfessores ( arquimedes, astronomia ) );
        cursosProfessores.Add ( new CursosProfessores ( arquimedes, filosofia ) );


        cursosProfessores.Add ( new CursosProfessores ( boyle, fisica ) );
        cursosProfessores.Add ( new CursosProfessores ( boyle, quimica ) );
        cursosProfessores.Add ( new CursosProfessores ( boyle, filosofia ) );

        cursosProfessores.Add ( new CursosProfessores ( chomsky, linguistica ) );
        cursosProfessores.Add ( new CursosProfessores ( chomsky, psicologia ) );
        cursosProfessores.Add ( new CursosProfessores ( chomsky, filosofia ) );

        cursosProfessores.Add ( new CursosProfessores ( darwin, biologia ) );

        cursosProfessores.Add ( new CursosProfessores ( einstein, matematica ) );
        cursosProfessores.Add ( new CursosProfessores ( einstein, fisica ) );

        cursosProfessores.Add ( new CursosProfessores ( faraday, fisica ) );
        cursosProfessores.Add ( new CursosProfessores ( faraday, quimica ) );

        cursosProfessores.Add ( new CursosProfessores ( gauss, matematica ) );
        cursosProfessores.Add ( new CursosProfessores ( gauss, fisica ) );
        cursosProfessores.Add ( new CursosProfessores ( gauss, astronomia ) );

        cursosProfessores.Add ( new CursosProfessores ( hawking, fisica ) );

        cursosProfessores.Add ( new CursosProfessores ( ibsen, literatura ) );

        cursosProfessores.Add ( new CursosProfessores ( joyce, literatura ) );

        cursosProfessores.Add ( new CursosProfessores ( koch, biologia ) );

        cursosProfessores.Add ( new CursosProfessores ( lacan, psicologia ) );
    }
    
24.12.2016 / 19:15