2009-06-01 7 views
2

J'ai la requête suivante:LINQ to Entity Framework Beaucoup Many Désireuse problème de chargement

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers") 
       where e.Customers.ID == customer.ID 
       select e; 

Et tout fonctionne, je reçois mes équipements et il charge correctement la table des fabricants (avec impatience). Mais quand j'essaie de faire beaucoup à plusieurs requête suivante:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers") 
       where e.Customers.ID == customer.ID 
       from cce in e.ContractEquipments 
       where cce.Contracts.EndedOn >= DateTime.Today 
       select e; 

où « ContractEquipments » est un nombre à plusieurs recherche entre les « équipements » et « contrats », mais lorsque cette requête est exécutée, la La table des fabricants n'est plus facilement chargée. Toute idée comment résoudre ce problème sans faire ce qui suit:

if (MyEntity.Manufacturers.IsLoaded == false) 
    MyEntity.ManufacturersReference.Load() 

Ce projet prend des heures et exécuter je veux garder le nombre de base de données Invoque.

EDIT # 1:

J'ai aussi essayé sans succès:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers") 
       where e.Customers.ID == customer.ID 
       join cce in ContractContext.ContractEquipments 
       on e.ID equals cce.Equipments.ID 
       where cce.Contracts.EndedOn >= DateTime.Today 
       select e; 

Répondre

7

comprend précoce sont souvent perdus sur certains types de requêtes (par exemple avec supplémentaire rejoint etc.)

La façon de se déplacer est de faire la requête, (puis tant que vous êtes des entités de retour Sélectionnez-à-dire e plutôt que d'une projection à savoir sélectionnez nouveau {...}) vous pouvez jeter à ObjectQuery et faire le comprennent autour de l'extérieur:

var MyQuery = ((from e in ContractContext.Equipments 
       where e.Customers.ID == customer.ID 
       from cce in e.ContractEquipments 
       where cce.Contracts.EndedOn >= DateTime.Today 
       select e) as ObjectQuery<Equipment>).Include("Manufacturers"); 

Cela devrait fonctionner.

Si vous êtes intéressé à plus d'informations sur ce, consultez Tip 22 - How to make Include really Include

Alex

+0

Merci mec, travaillé comme un charme. – JasonRShaver

+0

Juste se demander, n'est pas le point d'avoir une inclusion tôt est d'ajouter une sorte de fonctionnalité à cette entité dans la requête elle-même? Comme si vous vouliez inclure ("Fabricants") et l'inclure dans la clause where, si vous vouliez obtenir une liste de fabricants connexes trouvés à New York par exemple. – sksallaj

0

Avez-vous essayé une jointure au lieu comme ça?

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers") 
       where e.Customers.ID == customer.ID 
       join cce in e.ContractEquipments on e.Id equals cce.EquipmentId 
       where cce.Contracts.EndedOn >= DateTime.Today 
       select e; 
+0

J'ai juste essayé cela et cela n'a pas fonctionné. Voir l'édition n ° 1 ci-dessus. – JasonRShaver

+0

Que retourne-t-il? – bytebender

Questions connexes