Можно легко создать собственный дополнительный метод на IEnumerable или IQueryable:
public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource,TKey>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
(this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
Да, Вы теряете способность использовать выражение запроса здесь - но откровенно я не думаю, что Вы на самом деле извлекаете выгоду из выражения запроса так или иначе в этом случае. Выражения запроса являются большими для сложных вещей, но если Вы только делаете единственную операцию, более просто просто поместить ту одну операцию:
var query = dataList.OrderByWithDirection(x => x.Property, direction);
Это исключение генерируется вызовом Server.Transfer
для остановки выполнение текущего метода - то же самое происходит, если вы выполняете Response.Redirect
.
У вас есть два варианта:
ThreadAbortException / повторно выполнить
Server.Transfer
Server.Transfer
местами
там, где его не поймают (рекомендуется) РЕДАКТИРОВАТЬ: Поцарапайте это, http://support.microsoft.com/kb/312629 предлагает еще пару предложений, но я все же рекомендую # 2 выше.
Caling Server.Transfer вызовет Response.End, который всегда генерирует исключение ThreadAbortException. Это «специальное» исключение, потому что, хотя оно может быть поймано в блоке catch, оно всегда будет повторно выбрано в конце блока catch. Я бы хотел, чтобы ваш журнал ошибок игнорировал ThreadAbortExceptions.