LINQ to SQL (NHibernate): OrderBy против OrderByОбывающая абстракция - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь создать общий метод поиска, который может выполнять поиск различными способами, как по возрастанию, так и по убыванию.

Основа:

IQueryable<MyModel> query = nhSession.Query<MyModel>();

Мой вопрос заключается в том, могу ли я каким-либо образом абстрагироваться от вызова OrderBy против OrderByDescending, поэтому мне не нужно делать это if-ветвление для каждой опции упорядочения, которую я хочу поддерживать (упрощено до одного столбца, но может быть более сложнымупорядочения, включая ThenBy)?

if (orderAscending)
    query = query.OrderBy(x => x.SomeProperty);
else
    query = query.OrderByDescending(x => x.SomeProperty);

В идеале я хочу что-то вроде этого (псевдокод) с использованием делегатов, лямбда-функций или аналогичных, но не могу заставить что-то работать:

var filterFunc = orderAscending ? query.OrderBy : query.OrderByDescending;
query = filterFunc(query, x => x.SomeProperty);

или

query = query.Order(x => x.SomeProperty, orderAscending);

Я бы предпочел не использовать QueryOver, если это возможно, поскольку существует много другого кода, уже использующего вызовы vanilla LINQ.Я также пробовал .Reverse (), но, похоже, это не поддерживается поставщиком NH LINQ.

Невозможно получить весь список и перевернуть его в памяти, так как мне нужно тольконапример, извлеките верхние 100 из десятков тысяч строк.

1 Ответ

2 голосов
/ 22 мая 2019

Я нашел способ, создав собственные методы расширения, которые просто обертывают другие:

using System.Linq.Expressions;

namespace System.Linq
{
    public static class MyQueryableOrderExtensions
    {
        public static IOrderedQueryable<TSource> OrderByDirection<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
        {
            if (ascending)
                return source.OrderBy(keySelector);
            else
                return source.OrderByDescending(keySelector);
        }

        public static IOrderedQueryable<TSource> ThenByDirection<TSource, TKey>(this    IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
        {
            if (ascending)
                return source.ThenBy(keySelector);
            else
                return source.ThenByDescending(keySelector);
        }
    }
}

Пример использования:

query = query
    .OrderByDirection(x => x.MyProperty, orderAscending)
    .ThenByDirection(x => x.OtherProperty, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...