/// <summary>
        /// expr1 or expr2
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expr1"></param>
        /// <param name="expr2"></param>
        /// <returns></returns>
        public static Expression <Func <T, bool> > Or <T>(this Expression <Func <T, bool> > expr1, Expression <Func <T, bool> > expr2)
        {
            if (expr1 == null)
            {
                return(expr2);
            }
            else if (expr2 == null)
            {
                return(expr1);
            }

            ParameterExpression  newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor      = new NewExpressionVisitor(newParameter);

            var left  = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body  = Expression.Or(left, right);

            return(Expression.Lambda <Func <T, bool> >(body, newParameter));
        }
        /// <summary>
        /// expr1 AND expr2
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expr1"></param>
        /// <param name="expr2"></param>
        /// <returns></returns>
        public static Expression <Func <T, bool> > And <T>(this Expression <Func <T, bool> > expr1, Expression <Func <T, bool> > expr2)
        {
            if (expr1 == null)
            {
                return(expr2);
            }
            else if (expr2 == null)
            {
                return(expr1);
            }
            //This will not work which has error when compile new expression. the artuments in expr1.Parameters is not the one in expr2.Body.
            //return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
            ParameterExpression  newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor      = new NewExpressionVisitor(newParameter);

            //Put bodies of expr1 and expr2 in to a new expression
            var left  = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body  = Expression.And(left, right);

            return(Expression.Lambda <Func <T, bool> >(body, newParameter));
        }