2011-11-25 53 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,那就是我一直在尋找的東西。 –

相關問題