別の式から式<Func <T、bool>を作成する方法(式<Func <T、DateTime >>)

Where節の式を作成したい

Expression>

型のパラメータを受け取るメソッド

Expression>

私は、日付、時間、月、年のプロパティに比較句を追加するように、内部プロパティを比較するために私のDateTimeプロパティを操作したい。

私の方法は次のようなものです:

public static class MyUtils
{
    public static Expression> GetTime(this Expression> pExp, Expression> MyProperty, int day, int month, int year)
    {
    }
}

私はこれを次のように使いたい:

Expression> vExpression = p => false;
vExpression = vExpression.GetTime(c => c.MyDate, 21, 12, 2012);

メソッドの終わりに、私は "MyDate"プロパティと個々の日付の値を比較します。

これはできますか?

0
日、月、年のプロパティを使用したい
追加された 著者 Rodrigo Caballero,
大丈夫だと思う、それはあなたの質問ですか?
追加された 著者 Polity,

1 答え

おそらくこのような何か:

static Expression> GetTime(
    Expression> expression, 
    DateTime compare
)
{
    var comparison = Expression.Equal(expression.Body, Expression.Constant(compare));
    return Expression.Lambda>(comparison, expression.Parameters);
}

それから、次のことができます:

Expression> vExpression = GetTime(
    c => c.MyDate, 
    new DateTime(2012, 12, 21)
);

編集

上記のコードは、古いものに基づいて新しい式ツリーを作成する方法を示しています。任意の許可された構文を使用して、新しい式ツリーを作成できます。ここではやや複雑な例があります:

static Expression> GetTime(
    Expression> expression, 
    DateTime compare
)
{
    var comparison = Expression.AndAlso(
        Expression.AndAlso(
            Expression.GreaterThanOrEqual(
                Expression.Property(expression.Body, "Year"),
                Expression.Constant(compare.Year)
            ),

            Expression.GreaterThanOrEqual(
                Expression.Property(expression.Body, "Month"),
                Expression.Constant(compare.Month)
            )
        ),

        Expression.GreaterThanOrEqual(
            Expression.Property(expression.Body, "Day"),
            Expression.Constant(compare.Day)
        )
    );

    return Expression.Lambda>(comparison, expression.Parameters);
}
2
追加された
申し訳ありませんが、「Day」、「Month」、「Year」の各プロパティは、dateProperty.Year> Year> = 2011 &&の範囲でフィルタリングするために使用するため、互いに独立して操作する必要があります。 DateProperty.Year> = && dateProperty.Month> = 5 && dateProperty.Month> = 8 && dateProperty.Day> = 15 && dateProperty.Year> = 25
追加された 著者 Rodrigo Caballero,
ありがとう@Bojan、それは私が探していたものです。
追加された 著者 Rodrigo Caballero,