2012-06-26 2 views
1

내가 람다 식 구축하고자 만든 : 나는 PredicateBuilder를 사용결합 된 람다 동적

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(); 

을,하지만 난이 오류가있어 : 유형의

변수 'F' 'ProactisMvc.Web.ProactisWsServiceReference.Offre를' 범위 '에서 참조되었지만 정의되지 않았습니다.

무엇이 잘못 되었습니까? 다른 해결책이 있습니까?

답변

0

이 마지막 비트는 잘못된 것입니다 : 당신은 predicate의 몸하지만 다른 매개 변수를 사용하여 새로운 표현을 만드는

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

. 이것은 표현식 본문에서 사용되는 매개 변수 표현식이 최상위 표현식에서 허용되는 매개 변수 표현식이 아니라는 것을 의미합니다!

은 아마 당신은 PredicateBuilder의 마법에 의해 혼동되지만, 모든 .Or 첫 번째 조건의 매개 변수를 사용하여 두 번째 술어를 호출, || 표현을 사용하여 두 조건을 결합한다하고있다.

내가 방금 싶은 생각 :

var myDelegate = predicate.Compile(); 
+0

의미가 있습니다. 감사! – twisted