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

Framework .NET Discussion :

[Linq.Expression] Pourquoi ma surcharge 'Expression.And' lève une Exception ?


Sujet :

Framework .NET

  1. #1
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut [Linq.Expression] Pourquoi ma surcharge 'Expression.And' lève une Exception ?
    Bonjour,

    J'ai cette méthode qui utilise une lambda avec juste un Expression.Equal, et qui marche très bien:

    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
    19
     
    public T GetByID(Guid a_id)
            {
                var itemParameter = Expression.Parameter(typeof(T), "item");
     
                var whereExpression = Expression.Lambda<Func<T, bool>>
                    (
                        Expression.Equal(
                            Expression.Property(
                                itemParameter,
                                PrimaryKeyName
                            ),
                            Expression.Constant(a_id)
                        ),
                        new ParameterExpression[] { itemParameter }
                    );
     
                return _context.GetTable<T>().Where(whereExpression).Single();
            }
    mon souci c'est que j'ai besoin de surcharger cette méthode pour que l'expression lambda soit une 'Expression.And' au lieu d'une simple Expression.Equal.

    Voici le code:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public T GetByIDs(Guid[] a_ids)
            {
                var itemParameter1 = Expression.Parameter(typeof(T), "item");
                var itemParameter2 = Expression.Parameter(typeof(T), "item2");
     
                var equals1 = Expression.Equal(
                            Expression.Property(
                                itemParameter1,
                                PrimaryKeyNames[0]
                            ),
                            Expression.Constant(a_ids[0])
                        );
     
                var equals2 = Expression.Equal(
                            Expression.Property(
                                itemParameter2,
                                PrimaryKeyNames[1]
                            ),
                            Expression.Constant(a_ids[1])
                        );
     
                var andexpression = Expression.And(equals1, equals2);
     
                var parameters = new ParameterExpression[] { itemParameter1, itemParameter2 };
     
                var whereExpression = Expression.Lambda<Func<T, bool>> //BUG ICI
                    (andexpression, parameters);            
     
                return _context.GetTable<T>().Where(whereExpression).Single();
            }
    j'ai une erreur à l'appel du constructeur Expression.Lambda<Func<T, bool>> :
    "Incorrect number of parameters supplied for lambda declaration".

    La création des deux expressions "equals" (equals1 ,equals2) ainsi que "add"(andexpression ) se passent bien, et on l'air de contenir les données qu'il faut quand je les regarde en debug.

    l'erreur que j'ai est la suivante:
    "Incorrect number of parameters supplied for lambda declaration"

    Le truc c'est que c'est la seule erreur que .NET retourne dans le cas d'une erreur sur la création d'une lambda(il me semble), donc on ne peut pas se baser sur l'intitulé

    Quelqu'un à une idée?

  2. #2
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    Finalement c'est moi qui avait mal compris le but des Expression.Parameter...



    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public T GetByIDs(Guid[] a_ids)
            {
                var itemParameter = Expression.Parameter(typeof(T), "item");            
     
                var whereExpression = Expression.Lambda<Func<T, bool>>
                    (
                        Expression.And(
                        Expression.Equal(
                            Expression.Property(
                                itemParameter,
                                PrimaryKeyNames[0]
                            ),
                            Expression.Constant(a_ids[0])
                        ),
                        Expression.Equal(
                            Expression.Property(
                                itemParameter,
                                PrimaryKeyNames[1]
                            ),
                            Expression.Constant(a_ids[1])
                        )),
                        new ParameterExpression[] { itemParameter }                    
                    );
     
                return _context.GetTable<T>().Where(whereExpression).Single();
            }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/09/2012, 08h50
  2. Applet lève une exception vers Javascript
    Par cyrille37 dans le forum Applets
    Réponses: 0
    Dernier message: 23/11/2007, 16h06
  3. [ADO.Net][C#] Pourquoi OracleConnection lève une exception ?
    Par meuledor dans le forum Accès aux données
    Réponses: 2
    Dernier message: 26/01/2006, 17h54
  4. [8.2.1] SET CURRENT LOCK TIMEOUT lève une exception
    Par geoffrey_k dans le forum DB2
    Réponses: 2
    Dernier message: 28/11/2005, 09h24

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