Я ищу способ хранения коллекции Expression<Func<T, TProperty>>
, используемой для упорядочивания элементов, а затем для выполнения сохраненного списка с объектом IQueryable<T>
(основным провайдером является Entity Framework).
Например, я хотел бы сделать что-то вроде этого (это псевдо-код):
public class Program
{
public static void Main(string[] args)
{
OrderClause<User> orderBys = new OrderClause<User>();
orderBys.AddOrderBy(u => u.Firstname);
orderBys.AddOrderBy(u => u.Lastname);
orderBys.AddOrderBy(u => u.Age);
Repository<User> userRepository = new Repository<User>();
IEnumerable<User> result = userRepository.Query(orderBys.OrderByClauses);
}
}
Предложение order by (свойство, которое нужно заказать):
public class OrderClause<T>
{
public void AddOrderBy<TProperty>(Expression<Func<T, TProperty>> orderBySelector)
{
_list.Add(orderBySelector);
}
public IEnumerable<Expression<Func<T, ???>>> OrderByClauses
{
get { return _list; }
}
}
Репозиторий с моим методом запроса:
public class Repository<T>
{
public IEnumerable<T> Query(IEnumerable<OrderClause<T>> clauses)
{
foreach (OrderClause<T, ???> clause in clauses)
{
_query = _query.OrderBy(clause);
}
return _query.ToList();
}
}
Моя первая идея состояла в том, чтобы преобразовать Expression<Func<T, TProperty>>
в строку (имя свойства для сортировки). Таким образом, в основном вместо хранения типизированного списка (что невозможно, потому что TProperty не является константой), я сохраняю список строк со свойствами для сортировки.
Но это не работает, потому что тогда я не могу восстановить Expression
назад (мне это нужно, потому что IQueryable.OrderBy принимает параметр Expression<Func<T, TKey>>
as).
Я также попытался динамически создать Expression (с помощью Expression.Convert), чтобы иметь Expression<Func<T, object>>
, но затем я получил исключение из фреймворка сущности, который сказал, что он не смог обработать выражение Expression.Convert.
Если возможно, я не хочу использовать внешнюю библиотеку, такую как Динамическая библиотека Linq.