Выражение для Func с несколькими параметрами

Я пытаюсь написать выражение, которое вызывает метод, который принимает более одного аргумента в качестве входных данных, и это выражение действует как предложение where для механизма запросов nhibernate. В настоящее время я получаю сообщение об ошибке:

System.Exception: Неопознанный вызов метода: 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))

почему я использую выражения? Ну, это параметр функции, которая генерирует оператор запроса, и условие там может измениться.

Любая идея, что не так с приведенным выше кодом?


person user917670    schedule 06.03.2012    source источник


Ответы (1)


поставщик linq ожидает Expression, но вы даете ему Delegate, потому что используете Compile().

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

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

Обновление: если это известно только при построении запроса

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

Expression<Func<MyClass, bool>> CreateRestriction(int myNumber)
{
    return myClassObject => myClassObject.Property1 == myNumber;
}
person Firo    schedule 06.03.2012
comment
Фиро проблема в том, что myNumber не может быть установлен, когда я строю выражение, и поэтому я использовал его как второй параметр ... какое решение тогда? - person user917670; 06.03.2012