public static Expression <Func <T, bool> > Or <T>(this Expression <Func <T, bool> > exp_left, Expression <Func <T, bool> > exp_right)
        {
            var candidateExpr     = Expression.Parameter(typeof(T), "candidate");
            var parameterReplacer = new ParameterReplacer(candidateExpr);
            var left  = parameterReplacer.Replace(exp_left.Body);
            var right = parameterReplacer.Replace(exp_right.Body);
            var body  = Expression.Or(left, right);

            return(Expression.Lambda <Func <T, bool> >(body, candidateExpr));
        }
        public static Expression <Func <T, int, bool> > And <T>(this Expression <Func <T, int, bool> > exp_left, Expression <Func <T, int, bool> > exp_right)
        {
            var candidateExpr     = Expression.Parameter(typeof(T), "candidate");
            var parameterReplacer = new ParameterReplacer(candidateExpr);
            var left  = parameterReplacer.Replace(exp_left.Body);
            var right = parameterReplacer.Replace(exp_right.Body);

            var indexExpr          = Expression.Parameter(typeof(int), "index");
            var parameterReplacer2 = new ParameterReplacer(indexExpr);

            left  = parameterReplacer2.Replace(exp_left.Body);
            right = parameterReplacer2.Replace(exp_right.Body);
            var body = Expression.And(left, right);

            return(Expression.Lambda <Func <T, int, bool> >(body, candidateExpr, indexExpr));
        }