组合Lambda动态创建

时间:2012-06-26 08:13:23

标签: linq lambda expression predicatebuilder

我想构建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,但是我收到了这个错误:

从范围''引用的'ProactisMvc.Web.ProactisWsServiceReference.Offre'类型的变量'f',但未定义

怎么了?还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

最后一点是错误的:

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

您正在使用predicate的正文创建一个新表达式,但使用其他参数。这意味着表达式体内使用的参数表达式将不是顶级表达式所接受的参数表达式!

也许你对PredicateBuilder的魔力感到困惑,但所有.Or正在做的是使用||表达式组合两个谓词,使用第一个谓词的参数调用第二个谓词。

我想你只是想:

var myDelegate = predicate.Compile();