/// <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));
        }