2011-11-25 81 views
0

我想建立一个表达式为接受类型的参数上的方法的where子句如何从另一种表达构建表达式<Func键<T, bool>(表达式<Func键<T, DateTime>>)

Expression<Func<T, bool>> 

Expression<Func<T, DateTime>> 

我想操纵我的DateTime属性来比较它的内部属性,比如将比较子句添加到日,月和年属性。

我的方法是这样的:

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) 
    { 
    } 
} 

我想用这样的:

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

因此,在我有我之间有一些比较“的方法结束指明MyDate “财产和个人日期值。

可以这样做吗?

+0

看起来好吧,是你的问题吗? – Polity

+0

我想要使用日,月和年的属性 –

回答

2

也许是这样的:

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); 
} 

那么你可以这样做:

Expression<Func<MyClass, bool>> vExpression = GetTime<MyClass>(
    c => c.MyDate, 
    new DateTime(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); 
} 
+0

对不起,我不太清楚,我想操纵“日”,“月”和“年”属性相互独立,因为我会用它们来例如范围之间滤波器: dateProperty.Year> = 2011 && dateProperty.Year> = 2012 && dateProperty.Month> = 5 && dateProperty.Month> = 8 && dateProperty.Day> = 15 && dateProperty.Year> = 25 –

+0

谢谢@Bojan,那就是我一直在寻找的东西。 –

相关问题