J'ai essayé de faire beaucoup de recherches, mais je suis plus 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 expliquer, et donner quelques exemples sur ce que fait la Include()
déclaration dans le terme de la SQL
requête?
93
Réponses:
Disons par exemple que vous souhaitez obtenir une liste de tous vos clients:
Et supposons que chaque
Customer
objet a une référence à son ensemble deOrders
, et que chacunOrder
a des référencesLineItems
auxquelles peut également faire référence aProduct
.Comme vous pouvez le voir, la sélection d'un objet de niveau supérieur avec de nombreuses entités associées peut entraîner une requête qui doit extraire des données de nombreuses sources. En tant que mesure des performances,
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 peut amener tous les en-têtes de commande associés, mais aucun des autres enregistrements:
Enfin, depuis que vous avez demandé SQL, la première instruction sans
Include()
pourrait générer une instruction simple:La déclaration finale qui appelle
Include("Orders")
peut ressembler à ceci:la source
LineItems
etProducts
, la requête LINQ doit ressembler à cecivar customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();
:?Include()
pour capturer des objets le long de "chemins" différents. Si vous voulez des objets dans le même chemin, vous n'avez qu'à faire un seul appel qui spécifie le chemin complet. PuisqueLineItems
etProducts
ne partagez aucun composant de chemin, vous avez besoin d'appels séparés.Je voulais juste ajouter que "Inclure" fait partie d'un chargement impatient. 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 -entité-cadre-dans-une-application-asp-net-mvc
Extrait de la page liée:
la source
Considérez-le comme l'application du chargement hâtif dans un scénario où vos sous-éléments seraient autrement un chargement paresseux.
L'EF de requête qui envoie à la base de données donnera un résultat plus important au début, mais lors de l'accès, aucune requête de suivi ne sera effectuée lors de l'accès aux éléments inclus.
D'un autre côté, sans cela, EF exécuterait des requêtes séparées plus tard, lorsque vous accédez pour la première fois aux sous-éléments.
la source