LINQ to Entities пытается выполнить ваши запросы в базе данных, когда вы выполняете операцию LINQ на IQueryable <>.В вашем case "asc"
вы выполняете query.OrderBy, который LINQ to Entities интерпретирует как «преобразовать это в SQL», и он терпит неудачу, так как вы используете вызовы отражения, которые он не знает, как преобразовать в SQL.
Вы можете сделать query.AsEnumerable (). OrderBy (...).Одним из следствий этого является то, что при запуске операции OrderBy остальная часть запроса будет выполняться для предоставления данных.
Вместо того, чтобы использовать эти приемы отражения, вы могли бы получить, просто используяМетоды OrderBy и OrderByDescending, предназначенные для получения делегата для извлечения значения сортировки.(items.OrderBy(item => item.Property)
).Вам не хватает возможности указать восходящий или нисходящий в том же методе, но я бы просто сделал пару методов, таких как:
public static IOrderedQueryable<TSource> OrderByAscDesc<TSource, TKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector, bool isAsc
) {
return (isAsc ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}
public static IOrderedQueryable<TSource> OrderByAscDesc<TSource, TKey>(
this IQueryable<TSource> source,
Func<TSource, TKey> keySelector, bool ascDesc
) {
return (isDesc ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}