Maison >développement back-end >C++ >Comment charger avec impatience des entités liées avec une clause WHERE dans le cadre d'entité?

Comment charger avec impatience des entités liées avec une clause WHERE dans le cadre d'entité?

Susan Sarandon
Susan Sarandonoriginal
2025-02-01 13:46:08968parcourir

How to Eagerly Load Related Entities with a Where Clause in Entity Framework?

Chargement efficace des données connexes avec le filtrage dans le cadre d'entité

Cet article relève le défi de charger avec impatience des entités liées tout en appliquant des conditions de filtrage dans le cadre d'entité. L'approche optimale dépend de votre version EF.

Framework de l'entité 6 Solution

EF6 repose sur le chargement impatient et la fixation des relations. Cependant, ce mécanisme de fixation ne fonctionne pas toujours correctement avec des relations multiples à plusieurs. Une solution de contournement implique:

  1. Désactivation du chargement paresseux: Empêcher le chargement paresseux pour garantir que toutes les données sont récupérées dans une seule requête:

    <code class="language-csharp">Context.Configuration.LazyLoadingEnabled = false;</code>
  2. Projection avec filtrage: Utilisez une projection pour filtrer les entités liées pendant la requête:

    <code class="language-csharp">var buses = Context.Busses
                        .Where(b => b.IsDriving)
                        .Select(x => new { b, Passengers = x.Passengers.Where(p => p.Awake) })
                        .AsEnumerable()
                        .Select(x => x.b)
                        .ToList();</code>
  3. Fixup de relation automatique: EF remplira automatiquement la propriété Passengers de chaque objet Bus avec seulement les passagers éveillés.

  4. objets de transfert de données (DTOS): Utilisez un outil de mappage comme Automapper pour convertir les données récupérées en DTO pour un transfert de données optimal.

Solution du noyau du cadre de l'entité (5.0 et ultérieure)

EF Core 5.0 et les versions ultérieures prennent directement en charge les imbriquées incluent les clauses, simplifiant le processus:

<code class="language-csharp">var buses = Context.Busses
                    .Include(bus => bus.Passengers.Where(p => p.Awake))
                    .ToList();</code>

Approche alternative: bibliothèques tierces

Les bibliothèques comme EntityFramework.DynamicFilters offrent une méthode plus rationalisée pour gérer les filtres globaux applicables aux collections incluses. Cela peut améliorer la lisibilité et la maintenabilité du code pour des scénarios complexes.

Résumé

La meilleure approche pour charger avec impatience des données connexes avec le filtrage dans l'entité chargée du cadre sur la version utilisée. EF Core 5.0 offre une solution simple. Pour EF6, une solution de contournement impliquant la désactivation du chargement paresseux et l'utilisation de projections est nécessaire. Les bibliothèques tierces fournissent une alternative pour l'amélioration de l'organisation et de la flexibilité du code.

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