Reputation:
I have a custom LINQ provider that processes a MethodCallExpression that has a OrderBy clause inside it. How can I get hold of the OrderBy clause so that I may process it?
Upvotes: 3
Views: 137
Reputation:
I figured it out, here is how.
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;
}
}
Upvotes: 3