web-dev-qa-db-fra.com

Que fait Include () dans LINQ?

J'ai essayé de faire beaucoup de recherches mais je suis plutôt un gars de la base de données - donc même l'explication dans le MSDN n'a aucun sens pour moi. Quelqu'un peut-il s'il vous plaît expliquer, et donner quelques exemples sur ce que Include() fait dans le terme de SQL requête?

57
C.J.

Supposons par exemple que vous souhaitiez obtenir une liste de tous vos clients:

var customers = context.Customers.ToList();

Et supposons que chaque objet Customer ait une référence à son ensemble de Orders et que chaque Order ait des références à LineItems qui peuvent également faire référence à une Product.

Comme vous pouvez le constater, la sélection d'un objet de niveau supérieur avec de nombreuses entités associées peut entraîner une requête devant extraire des données provenant de nombreuses sources. En tant que mesure de performance, Include() vous permet d'indiquer quelles entités associées doivent être lues à partir de la base de données dans le cadre de la même requête.

En utilisant le même exemple, cela pourrait amener tous les en-têtes d'ordre associés, mais aucun des autres enregistrements:

var customersWithOrderDetail = context.Customers.Include("Orders").ToList();

Enfin, puisque vous avez demandé SQL, la première instruction sans Include() pourrait générer une instruction simple:

SELECT * FROM Customers;

La déclaration finale qui appelle Include("Orders") peut ressembler à ceci:

SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
109
Yuck

Je voulais juste ajouter que "Inclure" fait partie du chargement rapide. Il est décrit dans le didacticiel Entity Framework 6 de Microsoft. Voici le lien: https://docs.Microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related- data-with-the-entity-framework-in-an-asp-net-mvc-application


Extrait de la page liée:

Entity Framework peut charger des données associées dans les propriétés de navigation d'une entité de plusieurs manières:

Chargement paresseux. Lorsque l'entité est lue pour la première fois, les données associées ne sont pas récupérées. Cependant, lors de votre première tentative d'accès à une propriété de navigation, les données requises pour cette propriété de navigation sont automatiquement récupérées. Cela se traduit par plusieurs requêtes envoyées à la base de données - une pour l'entité elle-même et une à chaque fois que les données associées pour l'entité doivent être extraites. La classe DbContext permet le chargement différé par défaut.

Eager loading. Lorsque l'entité est lue, les données associées sont extraites avec elle. Cela se traduit généralement par une requête de jointure unique qui extrait toutes les données nécessaires. Vous spécifiez un chargement rapide en utilisant la méthode Include.

Chargement explicite. Ceci est similaire au chargement différé, sauf que vous récupérez explicitement les données associées dans le code; cela ne se produit pas automatiquement lorsque vous accédez à une propriété de navigation. Vous chargez les données associées manuellement en obtenant l'entrée du gestionnaire d'état d'objet pour une entité et en appelant la méthode Collection.Load pour les collections ou la méthode Reference.Load pour les propriétés qui contiennent une seule entité. (Dans l'exemple suivant, si vous souhaitez charger la propriété de navigation Administrateur, vous devez remplacer Collection(x => x.Courses) par Reference(x => x.Administrator).) Généralement, le chargement explicite n'est utilisé que lorsque vous avez désactivé le chargement paresseux.

Comme ils ne récupèrent pas immédiatement les valeurs de propriété, le chargement différé et le chargement explicite sont également appelés chargement différé.

18
Minoosha

Considérez cela comme une application de Eager-Loading dans un scénario où vos sous-éléments seraient autrement paresseux.

L’envoi de requête par EF à la base de données donnera d’abord un résultat plus grand, mais lors de l’accès, aucune demande complémentaire ne sera effectuée lors de l’accès aux éléments inclus.

D'autre part, sans cela, EF exécuterait des requêtes separte plus tard, lorsque vous accéderez aux sous-éléments pour la première fois.

1
robkrueger