Листинг выражений для OrderBy - PullRequest
1 голос
/ 10 сентября 2009

Я хотел бы иметь возможность сохранить список выражений для выполнения с IQueryable.OrderBy позднее, что-то вроде:

List<Expression<Func<MyType, object>>> list = new List<Expression<Func<MyType, object>>>();
  list.Add(x => x.Date);
  list.Add(x => x.ID);
  IOrderedQueryable<MyType> qry = query.OrderBy(list[0]).ThenBy(list[1]);

Однако при этом создается исключение InvalidOperationException - Невозможно упорядочить по типу System.Object, поскольку выражение определено для объекта, а не для конкретного типа, например Expression<Func<MyType, DateTime>> или Expression<Func<MyType, int>>

Как мне сохранить список выражений, чтобы я мог выполнить их позже в методе OrderBy?

1 Ответ

1 голос
/ 10 сентября 2009

Вам просто нужно добавить к этому заказу? Вам не нужно динамически удалять вещи позже? Если это так, то это относительно просто:

using System;
using System.Linq;
using System.Linq.Expressions;

class QueryOrdering<T>
{
    private Func<IQueryable<T>, IOrderedQueryable<T>> function;

    public void AddOrdering<TKey>(Expression<Func<T, TKey>> keySelector)
    {
        if (function == null)
        {
            function = source => source.OrderBy(keySelector);
        }
        else
        {
            // We need to capture the current value...
            var currentFunction = function;
            function = source => currentFunction(source).ThenBy(keySelector);
        }
    }

    public IOrderedQueryable<T> Apply(IQueryable<T> source)
    {
        if (function == null)
        {
            throw new InvalidOperationException("No ordering defined");
        }
        return function(source);
    }
}

Мне не нравится тот факт, что в нем используется мутация ... было бы не сложно написать неизменную версию, где AddOrdering вернул новый QueryOrdering<T> с новой функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...