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);
我正在尝试制作一种通用的搜索方法,可以以多种不同的方式(升序或降序)进行搜索。
基础:
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);