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

时间:2019-05-22 09:25:23

标签: c# mysql linq nhibernate linq-to-sql

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

依据:

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

我的问题是,我可以以任何方式抽象出OrderBy vs OrderByDescending调用,所以我不必为我要支持的每个单个订购选项都进行if分支(简化为单个列,但是可以是更复杂的排序,包括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,因为已经有很多其他使用香草LINQ调用的代码。我也尝试了.Reverse(),但是NH LINQ提供程序似乎不支持。

获取整个列表并在内存中反转它不是一种选择,因为我只需要提取例如几万行的前100个。

1 个答案:

答案 0 :(得分:2)

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

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