Я использую EF 4.2, но я ожидаю, что это применимо и к EF 4 и 4.1.
Я хотел бы передать метод IQueryable<T>
и multiple Expression<Func<TSource, TKey>>
методу и применить метод OrderBy
и ThenBy
к IQueryable<T>
, если это необходимо.
Я нашел этот ответ и написал метод, основанный на этом:
public IQueryable<User> ApplyOrderBy(IQueryable<User> query, IEnumerable<Expression<Func<User, IComparable>>> orderBy)
{
if (orderBy == null)
{
return query;
}
IOrderedQueryable<User> output = null;
foreach(var expression in orderBy)
{
if (output == null)
{
output = query.OrderBy(expression);
}
else
{
output = output.ThenBy(expression);
}
}
return output ?? query;
}
Это работает отлично, пока свойства, которые я заказываю, являются string
s, но когда я пытаюсь упорядочить с помощью свойства int
, я получаю исключение:
Невозможно ввести тип "System.Int32" для ввода "System.IComparable". LINQ to Entities поддерживает только листинг примитивных типов данных Entity Data Model.
Любые предложения по обходу этого или вообще для другого подхода? Я рассмотрел передачу в IEnumerable<Expression>
, но тогда вам нужно было бы выяснить, как отбросить конкретный тип (например, Expression<Func<User, int>
), чтобы вызвать OrderBy
.