Я использую 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.