2010-10-25 3 views
1

Je dispose de 2 ensembles d'entités Entity Framework avec une relation many-to-many (compromis de 3 tables DB). Pour les besoins de l'exemple, disons que j'ai une entité Worker et une entité Company, où chaque travailleur peut travailler dans plusieurs entreprises et chaque entreprise peut avoir beaucoup de travailleurs.Optimisation de plusieurs requêtes LINQ to Entity Framework

Je souhaite récupérer pour chaque travailleur toutes les entreprises pour lesquelles il/elle travaille. Le moyen simple serait de créer une requête pour chaque travailleur qui va chercher les entreprises en utilisant une jointure entre la table d'association et la table des sociétés, mais cela entraîne un aller-retour dans la base de données pour chaque travailleur. Je suis sûr que cela peut être fait d'une manière mieux optimisée. Toute aide serait appréciée.

Merci.

Répondre

1

Si votre table de jointure ne contient aucune information supplémentaire (uniquement les ID du travailleur et de l'entreprise), vous ne devriez avoir que deux entités dans votre modèle: Worker et Company. Si EF 4 le graphique de l'entité est impatient chargé par défaut, sauf si vous activez LazyLoading en faisant (context.ContextOptions.LazyLoadingEnabled = true;), vous obtenez vos listes d'entreprises chaque fois que votre requête pour les travailleurs:

var workers = context.Workers.ToList(); 
// Companies already loaded - do something with them 
var companiesForWorker0 = workers[0].Companies; // Don't forget to check 
...            // for null in real code 

Vous pouvez également dire directement EF désireux charger les entreprises lors de l'interrogation pour les travailleurs (qui seraient nécessaires si LazyLoading est activé):

var workers = context.Workers.Include("Companies").ToList(); 
+0

J'ai réalisé le fait que la table de jointure est une entité aussi bien est une erreur. –

0

Voici ce que je fais dans Linq2SQL et pourrait travailler pour vous.

  1. Faites la requête # 1.
  2. Collectez tous les 'ID' de travail dans une liste.
  3. Utilisez cette liste pour passer à la requête secondaire (en d'autres termes where list.Contains(item)).

Maintenant, cela ne devrait prendre que 2 requêtes.

Vous pourriez probablement les combiner en une seule requête avec un peu plus d'effort si nécessaire.

+0

Oui, c'est ce que vous avez à faire L2S, car elle génère une entité pour la table d'assemblage. Cela ne serait nécessaire que dans le cas où la table jointe contiendrait des données supplémentaires et une troisième entité existerait dans le modèle. – Yakimych

Questions connexes