C# 如何构建表达式<;Func<;T、 布尔>;来自另一个表达式(表达式<;Func<;T,日期时间>;)

C# 如何构建表达式<;Func<;T、 布尔>;来自另一个表达式(表达式<;Func<;T,日期时间>;),c#,linq,C#,Linq,我想为Where子句构建一个表达式 Expression<Func<T, bool>> 表达式 在接受类型为的参数的方法上 Expression<Func<T, DateTime>> 表达式 我想操纵DateTime属性来比较其内部属性,比如在day、month和year属性中添加compare子句 我的方法如下: public static class MyUtils { public static Expression<F

我想为Where子句构建一个表达式

Expression<Func<T, bool>>
表达式
在接受类型为的参数的方法上

Expression<Func<T, DateTime>>
表达式
我想操纵DateTime属性来比较其内部属性,比如在day、month和year属性中添加compare子句

我的方法如下:

public static class MyUtils
{
    public static Expression<Func<T, bool>> GetTime<T>(this Expression<Func<T, bool>> pExp, Expression<Func<T, DateTime>> MyProperty, int day, int month, int year)
    {
    }
}
公共静态类MyUtils
{
公共静态表达式GetTime(此表达式pExp、表达式MyProperty、整数天、整数月、整数年)
{
}
}
我想这样使用它:

Expression<Func<MyClass, bool>> vExpression = p => false;
vExpression = vExpression.GetTime<MyClass>(c => c.MyDate, 21, 12, 2012);
static Expression<Func<T, bool>> GetTime<T>(
    Expression<Func<T, DateTime>> expression, 
    DateTime compare
)
{
    var comparison = Expression.Equal(expression.Body, Expression.Constant(compare));
    return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters);
}
表达式vExpression=p=>false; vExpression=vExpression.GetTime(c=>c.MyDate,2012年12月21日); 因此,在方法的末尾,我对“MyDate”属性和各个日期值进行了一些比较


可以这样做吗?

或许可以这样做:

Expression<Func<MyClass, bool>> vExpression = p => false;
vExpression = vExpression.GetTime<MyClass>(c => c.MyDate, 21, 12, 2012);
static Expression<Func<T, bool>> GetTime<T>(
    Expression<Func<T, DateTime>> expression, 
    DateTime compare
)
{
    var comparison = Expression.Equal(expression.Body, Expression.Constant(compare));
    return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters);
}
静态表达式GetTime(
表情表情,
日期时间比较
)
{
变量比较=表达式.Equal(表达式.Body,表达式.Constant(比较));
返回表达式.Lambda(比较,表达式.参数);
}
然后,您可以执行以下操作:

Expression<Func<MyClass, bool>> vExpression = GetTime<MyClass>(
    c => c.MyDate, 
    new DateTime(2012, 12, 21)
);
表达式vExpression=GetTime(
c=>c.MyDate,
新日期时间(2012年12月21日)
);
编辑

上面的代码显示了如何基于旧的表达式树创建新的表达式树。可以使用任何允许的构造创建新的表达式树。下面是一个稍微复杂一点的例子:

static Expression<Func<T, bool>> GetTime<T>(
    Expression<Func<T, DateTime>> 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<Func<T, bool>>(comparison, expression.Parameters);
}
静态表达式GetTime(
表情表情,
日期时间比较
)
{
var比较=表达式.AndAlso(
安达尔索(
表达式。大于或等于(
Expression.Property(Expression.Body,“年”),
表达式.常量(比较.年)
),
表达式。大于或等于(
Expression.Property(Expression.Body,“月”),
表达式.Constant(比较.Month)
)
),
表达式。大于或等于(
Expression.Property(Expression.Body,“日”),
表达式.常量(比较.Day)
)
);
返回表达式.Lambda(比较,表达式.参数);
}

对我来说似乎没问题,这是你的问题吗?我想使用日、月和年属性。或者我不够清楚,我想操纵“日”、“月”和“年”属性彼此独立,因为我将使用它们在范围之间进行筛选,例如:dateProperty.Year>=2011&&dateProperty.Year>=2012&&dateProperty.Month>=5&&dateProperty.Month>=8&&dateProperty.Day>=15&&dateProperty.Year>=25Thank@Bojan,这就是我要找的。