2010-09-17 17 views
1

我有一個方法來添加一個日期條件到我的linq查詢。我想要做的就是將x.Due作爲參數傳入,以便能夠使用任何日期。有任何想法嗎?我怎樣才能從這個lambda表達式提取成員路徑

protected virtual IQueryable<TaskView> AddTaskDuePredicate(DateCriteria dateCriterion, IQueryable<TaskView> taskSummary) 
{ 
     if (dateCriterion.Condition == DateCondition.LessThan) 
      taskSummary = taskSummary.Where(x => x.Due < dateCriterion.Value1); 
     else if (dateCriterion.Condition == DateCondition.LessThanOrEqualTo) 
      taskSummary = taskSummary.Where(x => x.Due <= dateCriterion.Value1); 
     else if (dateCriterion.Condition == DateCondition.GreaterThan) 
      taskSummary = taskSummary.Where(x => x.Due > dateCriterion.Value1); 
     else if (dateCriterion.Condition == DateCondition.GreaterThanOrEqualTo) 
      taskSummary = taskSummary.Where(x => x.Due >= dateCriterion.Value1); 
     else if (dateCriterion.Condition == DateCondition.EqualTo) 
      taskSummary = taskSummary.Where(x => x.Due == dateCriterion.Value1); 
     else if (dateCriterion.Condition == DateCondition.Between) 
      taskSummary = taskSummary.Where(x => x.Due <= dateCriterion.Value1 && x.Due >= dateCriterion.Value2); 

    return taskSummary; 
} 

回答

1

你將不得不採取lambda表達式作爲一個表達式樹是這樣的:

protected virtual IQueryable<TaskView> AddTaskDuePredicate(
    Expression<Func<TaskView, DateTime>> projection, 
    DateCriteria dateCriterion, 
    IQueryable<TaskView> taskSummary) 

然後你必須從投影建立一個Expression<Func<TaskView, bool>>,使用像Expression.GreaterThanExpression.Lambda。關閉我的頭頂:

ParameterExpression p = projection.Parameters[0]; 
Expression constant = Expression.Constant(dateCriterion.Value1); 
Expression comparison = Expression.GreaterThan(projection.Body, constant); 
Expression lambda = Expression.Lambda<Func<TaskView, bool>> 
    (comparison, p); 
taskSummary = taskSummary.Where(lambda); 

這是完全雖然未經測試。很明顯,一旦你有這個工作GreaterThan,其餘的應該是相對很容易...

+0

謝謝,喬恩這就是我所需要的。 – 2010-09-17 21:31:19

0

這是我結束了。 我可以調用此方法的。凡()的參數 所以,

taskSummary.Where(AddDatePredicate<TaskView>(x => (DateTime)x.Due, filterInfo.Due)); 

     protected virtual Expression<Func<T, bool>> AddDatePredicate<T>(Expression<Func<T, DateTime>> projection, DateCriteria dateCriterion) 
     { 
      ParameterExpression p = projection.Parameters[ 0 ]; 
      Expression constant = Expression.Constant((DateTime)dateCriterion.Value1); 

      Expression comparison; 
      switch(dateCriterion.Condition) 
      { 
       case DateCondition.GreaterThan : 
        comparison = Expression.GreaterThan(projection.Body, constant); 
        break; 
       case DateCondition.GreaterThanOrEqualTo: 
        comparison = Expression.GreaterThanOrEqual(projection.Body, constant); 
        break; 
       case DateCondition.LessThan: 
        comparison = Expression.LessThan(projection.Body, constant); 
        break; 
       case DateCondition.LessThanOrEqualTo: 
        comparison = Expression.LessThanOrEqual(projection.Body, constant); 
        break; 

       case DateCondition.Between: 
        { 
         var comparisonLeft = Expression.GreaterThanOrEqual(projection.Body, Expression.Constant((DateTime)dateCriterion.Value1)); 
         var comparisonRight = Expression.LessThanOrEqual( projection.Body, Expression.Constant((DateTime)dateCriterion.Value2)); 

         comparison = Expression.AndAlso(comparisonLeft, comparisonRight); 
         break; 
        } 
       default: 
        return null;//TODO:Something bad happens here. 
      } 
相關問題