dynamic
или object
нельзя использовать как TKey
универсальный аргумент EF Queryable.OrderBy
(фактически в любом выражении метода Queryable
) - это должен быть фактический тип ключ. Это, в свою очередь, означает, что вы не можете использовать общую переменную Expression<Func<...>>
для хранения выражения keySelector
.
Решением является использование условного .OrderBy[Descending]
внутри вашего блока switch
/ case
.
Чтобы упростить обработку восходящего / нисходящего параметра (и избежать дублирования выражений), начните с создания простого пользовательского метода расширения, такого как:
namespace System.Linq
{
public static class QueryableExtensions
{
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
{
return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}
}
}
Затем переместите блок switch
/ case
после
recordFilterd = data.Count();
и используйте вышеуказанный вспомогательный метод внутри:
bool ascending = sortDirection == "asc";
switch (sortColumn)
{
case 0:
data = data.OrderBy(p => p.HolidayDate, ascending);
break;
case 1:
data = data.OrderBy(p => p.Name, ascending);
break;
case 2:
data = data.OrderBy(p => p.ExchangeMarket.Name, ascending);
break;
default:
data = data.OrderBy(p => p.CreatedOn, ascending);
break;
}