Как я могу извлечь путь члена из этого лямбда-выражения - PullRequest
1 голос
/ 17 сентября 2010

У меня есть метод для добавления условия даты в мой запрос linq. То, что я хочу сделать, это передать x.Due в качестве параметра, чтобы это работало с любой датой. Есть идеи?

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

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Вы должны будете взять лямбда-выражение в виде дерева выражений, например:

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

Тогда вам нужно будет построить Expression<Func<TaskView, bool>> из этой проекции, используя такие вещи, как Expression.GreaterThan и Expression.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, остальное должно быть относительно easy ...

0 голосов
/ 18 сентября 2010

Вот что я закончил. Я могу вызвать этот метод как параметр .Where () так,

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.
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...