【问题标题】:Combined Lambda dynamically created组合 Lambda 动态创建
【发布时间】:2012-06-26 16:22:28
【问题描述】:

我想构建 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”,但未定义

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

【问题讨论】:

    标签: linq lambda expression predicatebuilder


    【解决方案1】:

    最后一点是错误的:

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

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

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

    我想你只是想要:

    var myDelegate = predicate.Compile();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多