1
votes

EF Core Inclure, Où et ThenInclude

Je dois collecter des données à partir d'une base de données où les enregistrements supprimés ne sont pas vraiment supprimés, à la place, ils sont marqués (il y a une colonne de bits "IsActive" où les éléments supprimés ont la valeur 0).

Je suis en utilisant Entity Framework Core, et je souhaite obtenir une liste de devises (euro, dollar, ...). Chaque devise est associée à 1-n pays, il y a donc 3 colonnes en jeu ici:

  • Devise (ID, nom, ...)
  • CurrencyCountry (CurrencyId, CountryNumericCode)
  • Pays (NumericCode, Name, ...)

Je voudrais recevoir toutes les devises et leurs pays en un seul appel EF; donc j'ai quelque chose comme ça:

_ctx.Currency
.Where(c => c.IsActive)
.Include(c => c.CurrencyCountry)
.ThenInclude(cc => cc.CountryNumericCodeNavigation)
.ToList();

Cela fonctionne presque; le seul problème est que je dois préciser que je ne veux que les "CurrencyCountries" actifs. J'aimerais donc ajouter un "Where IsActive == true" après le "Include", et avant le "ThenInclude", mais il semble que cela ne peut pas être fait.

Y a-t-il une autre façon d'accomplir qu'est-ce que j'essaye de faire?

Merci!


1 commentaires

Du haut de ma tête, je pense que vous devrez peut-être faire n'importe quel quelque part


3 Réponses :


0
votes

Avez-vous essayé de lancer votre requête à partir de la table de jonction au lieu de Currency?

ctx.CurrencyCountry
.Include(c => c.Currency)
.Include(c => c.Country)
.Where(c => c.Country.IsActive && c.CurrencyCountry.IsActive)
.ToList();


1 commentaires

Merci pour la suggestion. J'ai besoin d'une liste de devises (mais je pourrais transformer la liste dans l'application?). Un autre problème avec cette solution est que s'il existe une devise sans pays associé, elle n'apparaîtra pas dans la liste.



0
votes

J'aimerais donc ajouter un "Where IsActive == true" après le "Include" et avant le "ThenInclude", mais il semble que cela ne peut pas être fait.

C'est toujours une discussion en cours sur ce sujet: https://github.com/aspnet/EntityFrameworkCore/issues/1833 p >

Une solution de contournement est que vous pouvez filtrer les données manuellement dans Select , ce qui est un peu complexe:

_ctx.Currency
    .Where(c => c.IsActive)
    .Include(c => c.CurrencyCountry)
    .ThenInclude(cc => cc.CountryNumericCodeNavigation)
    .Select(c => new Currency
    {
        //populate other fields in Currency model here
        CurrencyCountry = c.CurrencyCountry.Where(item => item.IsActive).ToList()
    })
    .ToList();

0 commentaires

1
votes

Clause de non-responsabilité : je suis le propriétaire du projet Entity Framework Plus

L'EF + Query IncludeFilter (gratuit et open source) permet de filtrer facilement les entités incluses .

Le ThenInclude n'est pas encore pris en charge mais il suffit d'inclure le dernier filtre pour avoir le même comportement.

Exemple:

< pré> XXX


0 commentaires