Optimisation des requêtes EF: filtrage des entités liées avec include
Cet article relève le défi de récupérer efficacement les entités connexes avec une clause Where
dans une requête entièrement framework (EF). L'objectif est d'éviter plusieurs voyages de base de données.
Le scénario implique deux entités: Bus
et Person
, avec Bus
ayant une propriété de navigation de collection pour Person
. L'objectif est de récupérer tous les bus qui conduisent, ainsi que uniquement les passagers qui sont éveillés.
Une approche inefficace commune entraîne plusieurs appels de base de données. Une solution plus efficace consiste à désactiver le chargement paresseux et à charger explicitement les entités liées avec une clause filtrée Where
dans la requête.
Voici un exemple démontrant cette approche:
<code class="language-csharp">Context.Configuration.LazyLoadingEnabled = false; var buses = Context.Busses.Where(b => b.IsDriving) .Select(b => new { Bus = b, AwakePassengers = b.Passengers.Where(p => p.Awake) }) .AsEnumerable() .Select(x => x.Bus) .ToList();</code>
Ce code récupère d'abord les bus de conduite et leurs passagers éveillés dans une seule requête de base de données. L'appel AsEnumerable()
matérialise les résultats dans la mémoire, permettant à EF d'établir correctement les relations. Enfin, seuls les objets Bus
sont sélectionnés et retournés.
Considérations importantes:
Cette méthode, bien que efficace dans EF6, pourrait nécessiter des ajustements pour les relations multiples-à-plusieurs et dans le noyau EF. EF Core propose des fonctionnalités telles que les filtres de requête globales qui peuvent fournir des solutions alternatives pour des scénarios plus complexes. Pour des informations détaillées sur ces techniques avancées et en manipulant des relations de plusieurs à plusieurs, veuillez vous référer à la source d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!