Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > Entity Framework
Entity Framework Forum d'entraide sur le développement avec le modèle d'accès aux données Entity Framework de Microsoft.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 15h26   #1
bor1s
Membre à l'essai
 
Inscription : 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 ?
bor1s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 08h32   #2
bor1s
Membre à l'essai
 
Inscription : novembre 2005
Messages : 74
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 74
Points : 23
Points : 23
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 !
bor1s est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h22.


 
 
 
 
Partenaires

Hébergement Web