链接 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
重载。
我希望能够动态地向我的查询添加排序:
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
重载。