2 votes

Expression sur Func avec plusieurs paramètres

J'essaie d'écrire une expression qui invoque une méthode qui accepte plus d'un argument en entrée et cette expression agit comme une clause "where" pour le moteur de requêtes de nhibernate. Actuellement, je reçois une erreur disant :

System.Exception : Appel de méthode non reconnu : System.Func`3[[MyClass, Assembly, Version=9.123.434, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=wjerkwr234],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=234234123]]:Boolean Invoke(MyClass, Int32)

 Expression<Func<MyClass, int, bool>> restricton=
         (myClassObject, myNumber) => myClassObject.Property1== myNumber;

session
    .QueryOver<MyClass>()
    .Where(x =>x.Property2==1)
    .And(x=>restriction.Compile().Invoke(x, 2))

pourquoi j'utilise l'expression ? Eh bien, c'est un paramètre de la fonction qui génère la requête et la condition peut changer.

Une idée de ce qui ne va pas avec le code ci-dessus ?

7voto

Firo Points 21003

Le fournisseur linq attend une Expression mais vous lui donnez un Délégué parce que vous utilisez Compile() .

int myNumber = 5;
Expression<Func<MyClass, bool>> restricton=
     myClassObject => myClassObject.Property1 == myNumber

session.QueryOver().Where(x => x.Property2 == 1).And(restriction)

Mise à jour : s'il n'est connu que lors de la construction de la requête

session.QueryOver().Where(x => x.Property2 == 1).And(CreateRestriction(2))

Expression<Func<MyClass, bool>> CreateRestriction(int myNumber)
{
    return myClassObject => myClassObject.Property1 == myNumber;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X