/// <summary>Determines if the <paramref name="expr"/> is a call to ThenBy.</summary> /// <param name="expr">Expression to inspect.</param> /// <returns>Instance of the <see cref="OrderByCallMatch"/> class if the <paramref name="expr"/> is a ThenBy call, /// or null otherwise.</returns> internal static OrderByCallMatch MatchThenByCall(Expression expr) { if (expr.NodeType == ExpressionType.Call && TypeSystem.IsMethodLinqThenBy(((MethodCallExpression)expr).Method)) { MethodCallExpression call = (MethodCallExpression)expr; LambdaExpression lambda = (LambdaExpression)ExpressionUtil.RemoveQuotes(call.Arguments[1]); Expression body = ExpressionUtil.RemoveQuotes(lambda.Body); return(new OrderByCallMatch { MethodCall = call, Source = call.Arguments[0], Lambda = lambda, LambdaBody = body }); } else { return(null); } }
/// <summary>Visits method call expression.</summary> /// <param name="m">The method call expression.</param> /// <returns>The visited expression.</returns> internal override Expression VisitMethodCall(MethodCallExpression m) { if (m.Method.Name == "Where") { Expression source = this.Visit(m.Arguments[0]); Expression lambdaArg = this.Visit(m.Arguments[1]); LambdaExpression lambda = (LambdaExpression)ExpressionUtil.RemoveQuotes(lambdaArg); Expression body = ExpressionUtil.RemoveQuotes(lambda.Body); Expression newBody; newBody = this.SimplifyBoolComparison(body); if (newBody != null) { return(Expression.Call( m.Method, source, Expression.Lambda(newBody, lambda.Parameters.ToArray()))); } } return(base.VisitMethodCall(m)); }