2

私が2つのパラメータを持っていたとしましょう:

パラメータ1Tを取り、そこから関連製品のIDをフェッチする式

Expression<Func<T,int>> prodIdProperty = x=>x.Product.Id

パラメータ2と比較するproductid、たとえば

int productid = 5;

これを(コードで)ランタイム変換して、次のような新しい式に変換する方法はありますか?

Expression<Func<T,bool>> prodIdProperty = x=>x.Product.Id == 5

私は基本的に次のようなものが必要です:

Expression<Func<T,bool>> TransformToPredicate(Expression<Func<T,int>> prodIdProperty,int productid){
//insert expression transform magic I don't seem to grasp...
}

これが必要なのは、EF Where句の述語として渡したいためです。つまり、サポートされていないInvoke()を呼び出す必要があるため、prodIdPropertyのコンパイル済みバージョンを含めることができません。

(私はすでにこの質問で別の方法で問題を定式化しようとしましたが、私はそこでそれを過度に複雑にしたと思います)

4

1 に答える 1

8

次のようなものが必要なようです。

Expression<Func<T, bool>> TransformToPredicate(
    Expression<Func<T, int>> prodIdProperty,
    int productId)
{
    Expression equals = Expression.Equal(prodIdProperty.Body,
                                         Expression.Constant(productId));
    return Expression.Lambda<Func<T, bool>>(equals, prodIdProperty.Parameters);
}

動作を示すサンプルコード:

using System;
using System.Linq.Expressions;

class Test
{    
    static Expression<Func<T, bool>> TransformToPredicate<T>(
        Expression<Func<T, int>> prodIdProperty,
        int productId)
    {
        Expression equals = Expression.Equal(prodIdProperty.Body,
                                             Expression.Constant(productId));
        return Expression.Lambda<Func<T, bool>>(equals, prodIdProperty.Parameters);
    }

    static void Main()
    {
        Expression<Func<string, int>> length = x => x.Length;

        var predicate = TransformToPredicate(length, 5);
        var compiled = predicate.Compile();

        Console.WriteLine(compiled("Hello")); // True
        Console.WriteLine(compiled("Foo")); // False
    }
}
于 2012-09-03T16:11:03.760 に答える