1

ラムダ式を作成したい:

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ことは、式を使用して2つの述語を結合||し、最初の述語のパラメーターを使用して2番目の述語を呼び出すことです。

私はあなたが欲しいと思います:

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