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,但出现此错误:

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

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

4

1 回答 1

0

最后一点是错误的:

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

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

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

我想你只是想要:

var myDelegate = predicate.Compile();
于 2012-06-26T08:22:28.007 回答