我正在尝试创建一种通用的搜索方法,该搜索方法可以以多种不同的方式搜索(升序或降序)。
依据:
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个。
答案 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);