Comment construire une requête LINQ to Entities pour charger des objects enfants directement, au lieu d’appeler une propriété Reference ou Load ()

Je ne suis pas habitué à utiliser LINQ to Entities (ou Entity Framework, quel qu’il soit) et j’écris beaucoup de code comme ceci:

var item = (from InventoryItem item in db.Inventory where item.ID == id select item).First(); 

puis appelant des méthodes sur cet object comme ceci:

 var type = item.ItemTypeReference; 

ou

 var orders = item.OrderLineItems.Load(); 

récupérer des objects enfant ou apparentés.

Je n’ai pas profilé la firebase database ou creusé trop profondément, mais je suppose que lorsque j’appelle une propriété .Load () ou une * Référence, je fais un autre appel à la firebase database. Si tel est le cas, existe-t-il un moyen d’obtenir ces objects dans mon expression LINQ initiale?

Vous souhaitez utiliser les références de la méthode .Include (chaîne) dans cet article “Mise en forme des résultats de la requête” .

 var item = from InventoryItem item in db.Inventory.Include("ItemTypeReference").Include("OrderLineItems") where item.ID == id select item; 

Il existe probablement une syntaxe de style “sql” pour le fichier Include.

Consultez également cet article sur le passage de LINQ-to-SQL à LINQ-to-Entities.

Pour ceux qui recherchent une solution à ce problème pour Linq to SQL, vous devez effectuer les opérations suivantes (Substituez DataContext et d’autres types pour ce que vous avez):

 using (DataContext db = new DataContext()) { DataLoadOptions options = new DataLoadOptions(); options.LoadWith(ii => ii.ItemTypeReference); options.LoadWith(ii => ii.OrderLineItems); db.LoadOptions = options; var item = from InventoryItem item in db.Inventory where item.ID == id select item; } 

Cela chargera les propriétés spécifiées dans LoadWith chaque fois que l’élément parent (InventoryItem) est chargé, pour ce contexte particulier.

En réponse à certaines questions de James et Jesper, consultez cette question

En plus de la réponse de Robert, vous voudrez peut-être consulter cette question pour connaître les options d’une méthode d’extension qui vous permet de .Include () en utilisant une expression à la place d’une chaîne, afin de vérifier la compilation:

Entity Framework .Include () avec vérification du temps de compilation?

AFAIK, Pour silverlight (services de domaine), l’ajout de l’atsortingbut [Include] au bon endroit (sur la propriété de navigation dans les métadonnées) est suffisant https://stackoverflow.com/a/5332188/413032