p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Nouveau Membre du Club
    Inscrit en
    novembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 74
    Points : 25
    Points
    25

    Par défaut EF et fonction qui retourne une expression

    Bonjour à tous !

    Je travail sur un projet qui utilise des requêtes linq dynamique sur une entité.
    J'ai un très grand nombres de cas et pour éviter la duplication de code j'ai refactoré (désolé pour le franglais...) en plusieurs méthodes.
    Mais utiliser des méthodes qui sont dans le magasin d'expression lève une exception, alors un des solutions est d'encapsuler le résultat de ces fonctions dans une expression qui elle pourra être interprété par linq to EF.

    Considérons alors ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    parentExpression = x => x.child.Any(y=>IsGoodChild(y,childType, childSize));
     
    private bool IsGoodChild(child c, int childType, int childSize){
         return c.type == childType && c.size == childSize;
    }
    Si je suis la logique proposé au dessus j'arrive à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    parentExpression = x => x.child.AsQueryable().Any(IsGoodChild(childType, childSize));
     
    private System.Linq.Expression.Expression<Func<child, bool>> IsGoodChild(int childType, int childSize){
         return  c => c.type == childType && c.size == childSize;
    }
    Mais là je me retrouve avec une jolie 'Internal .NET Framework Data Provider error 1025'

    Après moult et moult recherche je reste bloqué , avez-vous une idée et/ou solution ?

  2. #2
    Nouveau Membre du Club
    Inscrit en
    novembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 74
    Points : 25
    Points
    25

    Par défaut

    J'ai trouvé une solution alors je vous en fait part :

    Il m'a fallu créer une méthode static générique puis composer l'arbre d'expressions en utilisant les méthodes de fabrique de l'espace de noms System.Linq.Expressions :

    Code : 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
    17
    18
     
    //
    public static Expression<Func<TTargetObject,Boolean>> IsGoodChildFunctional<TTargetObject>(Int32 childType, Int32 childSize)
    {
                var e = Expression.Parameter(typeof(TTargetObject), "e");
                var childTypeMember = Expression.MakeMemberAccess(e, typeof(TTargetObject).GetProperty("childType"));
                var childSizeMember = Expression.MakeMemberAccess(e, typeof(TTargetObject).GetProperty("childSize"));
                var  childTypeConstant = Expression.Constant(childType, childType.GetType());
                var  childSizeConstant = Expression.Constant(childSize, childSize.GetType());
                BinaryExpression b;
                BinaryExpression bBis;
                Expression<Func<TTargetObject, bool>> returnedExpression;
                b = Expression.Equal(childTypeMember , childTypeConstant );
                bBis2 = Expression.Equal(childSizeMember, c2);
                var resultExpression = Expression.AndAlso(b, bBis);
                returnedExpression = Expression.Lambda<Func<TTargetObject, bool>>(resultExpression , e);
                return returnedExpression;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //l'appel à la méthode
    var predicat = IsGoodChildFunctional<child>(childType, childSize);
    parentExpression = x => x.child.Any(predicat);
    Le fait de construire le prédicat puis de l'utiliser m'évite bizarrement une exception : ".net framework data provider error 1025"

    vla chuz !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui retourne une collection
    Par superfly dans le forum Oracle
    Réponses: 9
    Dernier message: 25/06/2009, 18h02
  2. Fonction qui retourne une matrice
    Par condor_01 dans le forum C
    Réponses: 7
    Dernier message: 22/10/2007, 13h31
  3. Réponses: 9
    Dernier message: 08/08/2007, 11h35
  4. Réponses: 23
    Dernier message: 13/11/2006, 03h33
  5. [debutant] fonction qui retourne une valeur
    Par arnolpourri dans le forum JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 09h29

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