IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Ajouter un filtre avec EFCore


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut Ajouter un filtre avec EFCore
    Bonsoir à tous et meilleurs voeux pour 2022,
    Je sollicite votre aide (encore une fois) pour une situation que je n'arrive pas à résoudre.
    Je cherche à faire un filtre avec EFCore 3 et voici la premier test
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<UneEntitéQuiImplementeUneInterface>().HasQueryFilter(o => o.MaPropriete == null);
            }

    Ce code fonctionne (ouf).

    J'ai aussi essayé comme ça
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<UneEntitéQuiImplementeUneInterface>().HasQueryFilter(o => EF.Property<DateTime?>(o, nameof(UneInterface.MaPropriete)) == null);
            }

    Et ça fonctionne aussi...

    Super mais j'aimerais bien scanner l'ensemble de mes entités pour appliquer le même filtre et j'ai naturellement écrit ceci:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Model
                          .GetEntityTypes()
                          .Where(o => o.ClrType.GetInterface(typeof(UneInterface).Name) != null)
                          .ToList()
                          .ForEach(o => modelBuilder.Entity(o.ClrType).HasQueryFilter(o => o.MaPropriete== null));
            }

    Et là les ennuies commence, Visual Studio me dit "Impossible de convertir expression lambda en type 'LambdaExpression', car il ne s’agit pas d’un type délégué"
    Vous me direz, normal, VS ne sait pas sur quel objet il travaille donc il ne comprend pas l'expression lambda.
    Mais même avec l'autre forme qui ne dépend plus vraiment de mon objet, ben ça me met le même message d'erreur.

    OK, il veut un délégué, alors je code un délégué :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    delegate bool MyDelegate<T>(T o) where T : UneInterface;
    Et
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                MyDelegate<UneInterface> myDelegate = o => o.MaPropriete== null;
                modelBuilder.Model
                          .GetEntityTypes()
                          .Where(o => o.ClrType.GetInterface(typeof(UneInterface).Name) != null)
                          .ToList()
                          .ForEach(o =>modelBuilder.Entity(to.ClrType).HasQueryFilter(o => myDelegate(o)));
            }

    Toujours la même erreur

    Pourquoi n'arrive-je pas à le faire car là c'est un délégué non de non...

    Puis la malice me prend :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
                modelBuilder.Model
                          .GetEntityTypes()
                          .Where(o => o.ClrType.GetInterface(typeof(UneInterface).Name) != null)
                          .ToList()
                          .ForEach(
                                o =>
                                {
                                    ParameterExpression paramExp= Expression.Parameter(typeof(UneInterface));
                                    ConstantExpression constExp = Expression.Constant(null, typeof(DateTime?));
                                    MemberExpression memberExp = Expression.Property(numParam, nameof(UneInterface.MaPropriete));
                                    BinaryExpression binExp = Expression.Equal(memberExpression, constExp );
     
                                    var filter = Expression.Lambda<Func<UneInterface, bool>>(binExp, new[] { paramExp});
     
                                    modelBuilder.Entity(o.Name).HasQueryFilter(filter);
                                });

    Et là, nickel, plus d'erreur à la compilation.

    J'exécute et tout se passe bien exceptée la dernière ligne => The filter expression 'Param_0 => (Param_0.DissociationDate == null)' specified for entity type 'UneEntitéQuiImplementeUneInterface' is invalid. The expression must accept a single parameter of type 'MonNamespace.UneEntitéQuiImplementeUneInterface', return bool, and may not contain references to navigation properties.

    Bon alors vérifions ça :
    1. Mon expression accepte bien un seul paramètre de type 'MonNamespace.UneEntitéQuiImplementeUneInterface'
    2. Mon expression retourne bien un booléen
    3. Mon expression n'a pas de référence de navigation


    Alors où est le problème ?

    Si quelqu'un a une idée car là je suis tout sec, j'ai abattu toutes mes cartes pour le coup là... Enfin non, il me reste developpez.net

    Merci d'avance

    P.S. : J'ai aussi tenter de mettre Expression.Parameter(o.ClrType) mais là c'est à la construction du filtre que cela ne se passe pas bien => Impossible d'utiliser le ParameterExpression de type 'MonNamespace.UneEntitéQuiImplementeUneInterface' pour le paramètre de délégué de type 'MonNamespace.UneInterface'
    Et bien sûr, je ne peux pas le mettre dans mon expression lambda...

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Bonjour,
    Je me permet de relancer mon post...

    Pour le moment je n'ai rien trouvé mais j'ai eu d'autres chats à fouetter.

    Quelqu'un aurait-il une idée ?

    Merci

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Bonsoir,
    Je remets une pièce dans la machine pour faire remonter mon post...

    Personne pour m'aider ?

    Merci

Discussions similaires

  1. [WD14] Ajout enregistrement fichier avec filtre
    Par Dramon dans le forum WinDev
    Réponses: 5
    Dernier message: 17/02/2010, 20h23
  2. Réponses: 3
    Dernier message: 07/02/2006, 13h25
  3. [DOM] Ajouter un bouton avec un nouveau style
    Par Mehdi Feki dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/12/2005, 08h56
  4. Réponses: 1
    Dernier message: 02/01/2003, 12h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo