Well, abstracting the database and simplifying the types, leaving only what is essential the answer, not to complicate, I believe that the solution is 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 took a lot more work than writing the solution) and it seems to work. Add these methods to the class Program
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 ) );
}
Post the LINQ query code you have already developed.
– Ismael