2012-06-26 2 views
1

Я хочу построить лямбда-выражение:Комбинированный Lambda создан динамически

Expression<Func<MyObject, bool>> predicate = PredicateBuilder.False<MyObject>(); 
var param = Expression.Parameter(typeof(MyObject), "f"); 

if (myOperator == OperateurEnum.EG) 
{ 
    var body = Expression.Equal(
     Expression.PropertyOrField(param, myProperty), 
     Expression.Constant(myFilterValue) 
    ); 

    var lambda = Expression.Lambda<Func<MyObject, bool>>(body, param); 
    predicate = predicate.Or(lambda); 
} 
else if (myOperator == OperateurEnum.CT) 
{ 
    var body = Expression.Call(
     Expression.PropertyOrField(param, myProperty), 
     "StartsWith", 
     null, 
     Expression.Constant(myFilterValue) 
    ); 

    var lambda = Expression.Lambda<Func<MyObject, bool>>(body, param); 
    predicate = predicate.Or(lambda); 
} 
else if() 
{ 
    ... 
} 

var myEx = Expression.Lambda<Func<MyObject, bool>>(predicate.Body, param); 
Func<MyObject, bool> lambdaDelegate = myEx.Compile(); 

Я использую PredicateBuilder, но я получил эту ошибку:

переменную 'F' типа 'ProactisMvc.Web.ProactisWsServiceReference.Offre' ссылка из области действия '', но не определена

Что случилось? Есть ли другое решение?

ответ

0

Этот последний является неправильным:

var myEx = Expression.Lambda<Func<MyObject, bool>>(predicate.Body, param); 
Func<MyObject, bool> lambdaDelegate = myEx.Compile(); 

Вы создаете новое выражение с помощью predicate «s тело, но с некоторые другие параметра. Это будет означать, что выражение параметра, используемое внутри тела выражения, не будет принятым выражением верхнего уровня!

Возможно, вы смущены магией PredicateBuilder, но все, что делает .Or, это объединение двух предикатов с использованием выражения ||, вызывающего второй предикат с использованием параметра первого предиката.

Я думаю, что вы просто хотите:

var myDelegate = predicate.Compile(); 
+0

Он работает. Благодаря! – twisted

Смежные вопросы