链接 IQueryable 表达式树

Chaining IQueryable expression trees

我希望能够动态地向我的查询添加排序:

Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order1 = e => e.OrderBy(x => x.Weight);
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order2 = e => e.OrderByDescending(x => x.Weight).ThenBy(x => x.Price);
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order3 = e => e.OrderBy(x => x.Category).ThenBy(x => x.Price);

IQueryable<MyEntity> query = any EF query;

var transformedQuery = query.Transform(order1/order2/order3);

如何实施 Transform()

public static IQueryable<T> Transform<T>(this IQueryable<T> query, Expression<Func<IQueryable<T>, IOrderedQueryable<T>>> orderExpr)
{
   // ??????????????????
}

我的问题是我不想为 ascending/descending 排序设置 2 个重载。我需要应用传递的任何 OrderBy()/OrderByDescending() 表达式或它们的组合。

在这种情况下,您不需要表达式树。甚至是辅助方法。

Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>> order = e => e.OrderBy(x => x.Weight);
IQueryable<MyEntity> query = any EF query;

var transformedQuery = order(query);

这是有效的,因为当在查询中传递 order 时,它本身可以调用采用表达式树的适当 Queryable.OrderBy 重载。