Maison >développement back-end >C++ >Comment puis-je utiliser efficacement EF «Inclure» avec une clause «Where» pour les entités connexes?

Comment puis-je utiliser efficacement EF «Inclure» avec une clause «Where» pour les entités connexes?

Susan Sarandon
Susan Sarandonoriginal
2025-02-01 13:41:11464parcourir

How Can I Efficiently Use EF `Include` with a `Where` Clause for Related Entities?

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 BusesIsDriving est vraie, et seul le PassengersAwake 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:

  • Chargement paresseux: Désactivez toujours le chargement paresseux (LazyLoadingEnabled = false) Lorsque vous utilisez des projections et un fixation de relations pour éviter les appels de base de données inattendus.
  • plusieurs à plusieurs: Les relations multiples-à-plusieurs peuvent nécessiter une affectation manuelle d'entités apparentées après avoir récupéré, même avec Fixup.
  • Avantages tiers: Les bibliothèques tierces fournissent des solutions plus flexibles et maintenables pour les scénarios de filtrage complexes.
  • EF Core Future Améliorations: Gardez un œil sur les mises à jour de base EF pour les améliorations potentielles des capacités de filtre de requête globale.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn