【问题标题】:Chaining IQueryable expression trees链接 IQueryable 表达式树
【发布时间】:2017-05-30 01:15:07
【问题描述】:

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

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)
{
   // ??????????????????
}

我的问题是我不希望有 2 个重载用于升序/降序排序。我需要应用任何OrderBy()/OrderByDescending() 表达式或它们的组合。

【问题讨论】:

  • 不能在AddOrder中也添加第一个订单吗?
  • 很遗憾,没有,我需要一个通用方法,在向查询添加排序后执行其他转换。
  • 原来的OrderBy/ThenBy有什么问题?正如@hdv 所说,你不需要任何其他东西(如果我没有错过任何东西......)
  • 这个例子没有意义。我们来看看前2个例子。第一个按重量排序,第二个按重量降序排序!!!到底该怎么办???

标签: c# .net entity-framework-6 expression-trees iqueryable


【解决方案1】:

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

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 重载,该重载采用表达式树。

【讨论】:

  • 我不确定我是否理解。我需要一个排序参数作为表达式,因为转换后的查询将传递给 EF 提供程序。
  • @UserControl order 将传入x =&gt; x.Weight 作为表达式树。这足以让 EF 将其转换为 SQL。当你直接写context.MyEntities.OrderBy(e =&gt; e.MyProperty)的时候,这就是直接调用Queryable.OrderBy,方法一样。
猜你喜欢
  • 2010-12-07
  • 2015-08-20
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多