Optimisation des requêtes EF Include
avec Where
clauses
Challenge: Remplacer efficacement les entités associées en utilisant la méthode d'EF Include
tout en filtrant simultanément les entités liées à l'aide d'une clause Where
peut être délicate. Les approches naïves conduisent souvent à de multiples voyages de base de données et aux erreurs de cartographie potentielles.
Stratégies de solution:
1. Solution EF6 (projection et fixation):
Pour les versions du cadre 6 et antérieures d'entité, une solution de contournement implique de désactiver le chargement paresseux et d'utiliser une projection pour sélectionner uniquement les données nécessaires. La relation de relation gère ensuite l'association.
<code class="language-csharp">Context.Configuration.LazyLoadingEnabled = false; var buses = Context.Busses.Where(b => b.IsDriving) .Select(b => new { b, Passengers = b.Passengers.Where(p => p.Awake) }) .AsEnumerable() .Select(x => x.b) .ToList();</code>
Cette approche récupére Buses
où IsDriving
est vraie, et seul le Passengers
où Awake
est vrai pour chaque bus. Surtout, le correctif de relation rétablit la connexion entre le Bus
et son filtré Passengers
.
2. Tiration des bibliothèques tierces:
Les bibliothèques telles que EntityFramework.DynamicFilters
et EntityFramework.Filters
offrent une approche plus propre. Ces outils vous permettent de définir des filtres globaux qui s'appliquent automatiquement à vos requêtes, y compris les propriétés imbriquées, simplifiant le processus de filtrage dans Include
instructions.
3. Considérations de base EF:
EF Core fournit des filtres de requête globaux, mais leurs capacités actuelles sont limitées. Ils fonctionnent principalement sur l'entité racine et ne prennent pas directement en charge les propriétés de navigation de filtrage dans les instructions Include
. Les versions futures peuvent améliorer cette fonctionnalité.
Considérations importantes:
LazyLoadingEnabled = false
) Lorsque vous utilisez des projections et un fixation de relations pour éviter les appels de base de données inattendus. 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!