2015-04-25 2 views

ответ

2

Я понял, вот как.

public class QueryContext<T> 
    { 
     void Execute(MethodCallExpression dsQueryExpression) 
     { 
      var orderByFinder = new OrderByFinder(); 
      var orderByExpression = orderByFinder.GetOrderBy(dsQueryExpression); 
      // .. Continue on processing the OrderBy expression 
     } 
    } 

    internal class OrderByFinder : ExpressionVisitor 
    { 
     MethodCallExpression _orderByExpression; 

     public MethodCallExpression GetOrderBy(Expression expression) 
     { 
      Visit(expression); 
      return _orderByExpression; 
     } 

     protected override Expression VisitMethodCall(MethodCallExpression expression) 
     { 
      if (expression.Method.Name == "OrderBy") _orderByExpression = expression; 

      Visit(expression.Arguments[0]); 

      return expression; 
     } 
    } 
+0

Это даст вам один, помните, что может быть много! – MBoros

+0

@MBoros Да, мой находит нижнее предложение OrderBy, которое подходит для моего использования, поскольку источник данных OData, к которому я обращаюсь, поддерживает только порядок на первом уровне запроса. –

+0

@IngeHenriksen Кроме 'OrderBy', есть' OrderByDescending' плюс 'ThenBy' /' ThenByDescending' – xanatos