44 votes

Comment construire une requête LINQ to Entities pour charger directement les objets enfants, au lieu d'appeler une propriété Reference ou Load() ?

Je suis nouveau dans l'utilisation de LINQ to Entities (ou Entity Framework, quel que soit le nom qu'on lui donne) et j'écris beaucoup de code comme celui-ci :

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

et ensuite appeler des méthodes sur cet objet comme ceci :

var type = item.ItemTypeReference;

ou

var orders = item.OrderLineItems.Load();

pour récupérer des objets enfants ou apparentés.

Je n'ai pas profilé la base de données ni creusé trop profondément, mais je pense que lorsque j'appelle un .Load() ou une propriété *Reference, je fais en fait un autre appel à la base de données. Si c'est le cas, y a-t-il un moyen d'obtenir ces objets dans mon expression LINQ initiale ?

62voto

Robert Wagner Points 7904

Vous voulez utiliser les références de la méthode .Include(string) dans cet exemple. "Façonner les résultats des requêtes" article.

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

Il existe probablement aussi une syntaxe de style "sql" pour les inclusions.

Voir aussi ceci article sur le passage de LINQ-to-SQL à LINQ-to-Entities.

Pour les autres personnes qui cherchent une solution à ce problème pour Linq to SQL vous voulez faire ce qui suit (remplacez DataContext et les autres types par ce que vous avez) :

using (DataContext db = new DataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
    options.LoadWith<InventoryItem>(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) sera chargé, pour ce contexte particulier.

En réponse à d'autres questions de James et Jesper, jetez un coup d'œil à ceci question

0voto

Mike Chamberlain Points 5325

En plus de la réponse de Robert, vous pouvez consulter cette question pour connaître les options d'une méthode d'extension qui vous permet de .Include() en utilisant une expression au lieu d'une chaîne, afin d'obtenir une vérification au moment de la compilation :

Entity Framework .Include() avec vérification à la compilation ?

0voto

Davut Gürbüz Points 1609

AFAIK, Pour silverlight (services de domaine), il suffit d'ajouter l'attribut [Include] au bon endroit (au-dessus de la propriété de navigation dans les métadonnées). http://stackoverflow.com/a/5332188/413032

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