3

私は新しいコーダーであり、式ツリーを使用して次のラムバ式を動的に作成する際に多くの問題を抱えています。

( x, y ) => DateTime.Compare( y.EFFECTIVE_DATE, x.EFFECTIVE_DATE )

式ツリーの基本を理解し始めたばかりですが、これを作成するのに十分な知識がないようです。正直なところ、私はこれを本当に手探りしているので、ここに実際に置く良いコードはありません。どんな助けでも素晴らしいでしょう。

前もって感謝します。

申し訳ありませんが、初めて投稿し、アイテムの書式設定に問題があります。

だから、私の主な方法では、次のものがあります:

var sortExpression = testing.GetExpression( "EFFECTIVE_DATE", "EFFECTIVE_DATE" );

        if (e.SortDirection == SortDirection.Ascending)
        {
            paymentAuthorizationList.Sort( sortExpression );  
        }

そして、私の Get Expression メソッドで:

    public Expression<Func<AuthorizePayments, AuthorizePayments, int >> GetExpression<t>( string propertyName, string propertyValue )
    {

        var paramX = Expression.Parameter( typeof( AuthorizePayments ), "x" ); // x
        var paramY = Expression.Parameter( typeof( AuthorizePayments ), "y" ); // y

        var xDate = Expression.Property( paramX, "EFFECTIVE_DATE" ); // x.EFFECTIVE_DATE
        var yDate = Expression.Property( paramY, "EFFECTIVE_DATE" ); // y.EFFECTIVE_DATE

        // DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
        var body = Expression.Call( typeof( DateTime ).GetMethod( "DateTime.Compare" ), yDate, xDate );

        // (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
        var expr = Expression.Lambda<Func<AuthorizePayments, AuthorizePayments, int >>( body, paramX, paramY );

式を返します。}

現時点で変数が間違っていることはわかっています。並べ替え式は、並べ替えメソッドでは機能しません。

私がやろうとしていることのベースから外れているだけですか?

無知で申し訳ありませんが、助けてくれてありがとう。

4

1 に答える 1

4

まあ、ラムダ式を使用してコンパイラの助けを借りて「静的に」作成できます。

Expression<Func<Foo, Foo, int>> expr =
            (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE);

「手で」やりたい場合:

var paramX = Expression.Parameter(typeof(Foo), "x"); // x
var paramY = Expression.Parameter(typeof(Foo), "y"); // y

var xDate = Expression.Property(paramX, "EFFECTIVE_DATE"); // x.EFFECTIVE_DATE
var yDate = Expression.Property(paramY, "EFFECTIVE_DATE"); // y.EFFECTIVE_DATE

// DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
var body = Expression.Call(typeof(DateTime).GetMethod("Compare"), yDate, xDate);

// (x, y) => DateTime.Compare(y.EFFECTIVE_DATE, x.EFFECTIVE_DATE)
var expr = Expression.Lambda<Func<Foo, Foo, int>>(body, paramX, paramY);
于 2013-02-27T14:38:56.837 に答える