Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre à l'essai
    Inscrit en
    novembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 74
    Points : 23
    Points
    23

    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 :
    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 :
    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
    Membre à l'essai
    Inscrit en
    novembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 74
    Points : 23
    Points
    23

    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 :
    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •