TransformPredicateLambda <TOldTarget, TNewTarget>(
        Expression <Func <TOldTarget, bool> > predicate)
    {
        var lambda = (LambdaExpression)predicate;

        if (lambda == null)
        {
            throw new NotSupportedException();
        }

        var mutator   = new ExpressionTargetTypeMutator(t => typeof(TNewTarget));
        var explorer  = new ExpressionTreeExplorer();
        var converted = mutator.Visit(predicate.Body);

        return(Expression.Lambda <Func <TNewTarget, bool> >(
                   converted,
                   lambda.Name,
                   lambda.TailCall,
                   explorer.Explore(converted).OfType <ParameterExpression>()));
    }
        TransformPredicateLambda <TOldTarget, TNewTarget>(
            Expression <Func <TOldTarget, bool> > predicate)
        {
            var lambda = (LambdaExpression)predicate;

            if (lambda == null)
            {
                return(null);
            }

            var mutator   = new ExpressionTargetTypeMutator(t => typeof(TNewTarget));
            var explorer  = new ExpressionTreeExplorer(); // For getting the parameter expressions
            var converted = mutator.Visit(lambda.Body);

            return(Expression.Lambda <Func <TNewTarget, bool> >(
                       converted,
                       lambda.Name,
                       lambda.TailCall,
                       explorer.Explore(converted)));
        }