LINQ to SQL (NHibernate):OrderBy 与 OrderByDescending 抽象

LINQ to SQL (NHibernate): OrderBy vs OrderByDescending abstraction

我正在尝试制作一种通用的搜索方法,可以以多种不同的方式(升序或降序)进行搜索。

基础:

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

我的问题是,我能否以任何方式抽象出 OrderBy 与 OrderByDescending 调用,这样我就不必为我想要支持的每个单个排序选项(简化为单个列,但可能是更复杂的顺序,包括 ThenBy)?

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

理想情况下,我想要这样的东西(伪代码),使用委托、lambda 函数或类似的东西,但无法让它工作:

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 行。

我找到了一种方法,通过创建我自己的扩展方法来包装其他方法:

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);