5 votes

Demander Linq Joindre Beaucoup à Beaucoup

Je suis en train d'utiliser Linq-SQL Entity pour mon application MVC2.

J'ai ces tables / entités

Personne ( ID , Nom , Prénom ) Voiture (ID , Modèle , Nom) Revendeur ( ID , Nom)

Et j'ai ces 2 tables de liaison Many to Many

Personnes_Voitures ( ID , ID_Personne , ID_Voiture) Personnes_Revendeurs ( ID, ID_Personne, ID_Revendeur)

 public MyModel {

   //Certains Champs

    public List listeVoitures;

    public CarPersonne 
    {
      String détail;
      int id;
    }
}
 var query=(from personne in data.Personne

                     join PerVoiture in data.Personnes_Voitures on personne.ID equals Personnes_Voitures.ID_Personne into JointPerVoiture
                     from PerVoiture in JointPerVoiture.DefaultIfEmpty()

                     join voiture in data.voiture on PerVoiture.id_voiture equals voiture.ID into JointVoiturePer
son
                     from voiture in JointVoiturePerson.DefaultIfEmpty()

                     join PerRevendeur in data.Personnes_Revendeurs on personne.ID equals  PerRevendeur .id_personne into JointPersRevendeur 
                     from PerRevendeur in JointPersRevendeur.DefaultIfEmpty()

                     join Revendeur in data.Revendeur on PerRevendeur.id_revendeur equals Revendeur.ID into JointRevendeurPers
                     from Revendeur in JointRevendeurPers.DefaultIfEmpty()

                     where personne.ID_UTILISATEUR == UTILISATEUR.ID 
                     select new MyModel
                                { 
                                     listeVoitures = JointPerVoiture.Select(m=>new CarPersonne {détail=m.voiture.Modèle,id = m.ID}).ToList()},
                                //Autres
                                });

Je sais que c'est totalement faux mais je débute en Linq-SQL J'ai un problème maintenant :

La requête fonctionne mais mes résultats sont incorrects. En fait, si une personne a 2 voitures, je reçois la même personne deux fois avec 2 listes de voitures.

Exemple

Monsieur Brown a 2 voitures Je reçois Monsieur Brown ---> Liste de voitures (Voiture1 , Voiture2) Monsieur Brown ---> Liste de voitures (Voiture1, Voiture2)

Donc j'ai besoin que si une personne a 2 voitures, je reçois seulement 1 résultat de la personne avec ses propres voitures

Y a-t-il un moyen d'écrire cette requête mieux ? Comment pourrais-je résoudre mon problème ?

Merci

10voto

Sergey Berezovskiy Points 102044

Je pense qu'une simple sous-requête fera l'affaire (pareil pour les revendeurs):

from p in data.Person
select new MyModel {
  carList = (from pc in data.Persons_Cars
             join c in data.car on pc.id_car equals c.ID
             where pc.ID_Person == p.ID 
             select c).ToList()
};

Si vous avez des propriétés de navigation définies, alors la requête sera encore plus simple (Linq fera la jointure pour vous):

from p in data.Person
select new MyModel {
   carList = p.Person_Cars.Select(pc => pc.Car).ToList()
};

3voto

jaybro Points 61

Avec les bonnes propriétés sur Personne et Voiture et les relations de base de données, cela peut être configuré dans la méthode OnModelCreating de votre contexte afin que vous n'ayez pas besoin d'un modèle Person_Cars dans votre contexte :

modelBuilder.Entity()
                .HasMany(x => x.People)
                .WithMany(y => y.Cars)
                .Map(z =>
                {
                    z.MapLeftKey("CarID");
                    z.MapRightKey("PersonID");
                    z.ToTable("Person_Cars");
                });

Ensuite, vous devriez être en mesure d'obtenir les voitures de votre personne via :

from p in context.People
where p.PersonID = pID
select p.Cars

Ou retournez la Personne avec sa liste de voitures remplie :

context.People.Where(p => p.PersonID == pID).Include(c => c.Cars).FirstOrDefault();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X