2012-06-26 46 views
1

我想建立lambda表达式:联合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的身体,但与一些其他参数一种新的表达。这将意味着在表达式主体内使用的参数表达式不会被顶级表达式接受!

也许你被PredicateBuilder的魔法搞糊涂了,但是所有的.Or都在使用||表达式结合这两个谓词,使用第一个谓词的参数调用第二个谓词。

我觉得你只是想:

var myDelegate = predicate.Compile(); 
+0

它的工作原理。谢谢! – twisted