У меня есть запрос IQueryable и я хочу применить к нему сортировку динамически, сортировка может быть по многим столбцам (asc или desc). Я написал следующую обобщенную функцию:
private IQueryable<T> ApplySorting<T,U>(IQueryable<T> query, Expression<Func<T, U>> predicate, SortOrder order)
{
if (order == SortOrder.Ascending)
{
{
return query.OrderBy<T, U>(predicate);
}
}
else
{
{
return query.OrderByDescending<T, U>(predicate);
}
}
}
SortOrder - это мое простое перечисление с двумя значениями: по возрастанию и по убыванию
Затем я вызываю эту функцию в цикле для каждого столбца, который пользователь запрашивал сортировку. Однако я заметил, что это не удается, потому что он всегда сортируется по последнему использованному столбцу, игнорируя остальные.
Затем я обнаружил, что в IOrderedQueryable есть метод ThenBy, поэтому допустимое использование:
var q = db.MyType.OrderBy(x=>x.Col1).ThenBy(y=>y.Col2); //etc.
Но как я могу сделать его родовым? Я попытался проверить, является ли запрос IOrderedQueryable, но он всегда кажется истинным, даже если он простейший var q = from x в db.
Понятия не имею, почему это было задумано. Что не так с:
var q = db.MyType.OrderBy(x=>x.Col1).OrderBy(y=>y.Col2); //etc.
это так интуитивно понятно