/// <summary>
        /// Optimizes the filter contains expressions.
        /// </summary>
        /// <param name="expr">The expr.</param>
        /// <returns></returns>
        private static Expression OptimizeFilterContainsExpressions(Expression expr)
        {
            var nullEqualConditionalMatch = ExpressionUtil.MatchNullEqualConditional(expr);

            if (nullEqualConditionalMatch != null &&
                nullEqualConditionalMatch.ComparisonOperand.Type == typeof(String))
            {
                if (((MemberExpression)nullEqualConditionalMatch.ComparisonOperand).Member.Name == ((MemberExpression)((MethodCallExpression)((UnaryExpression)nullEqualConditionalMatch.IfNotNull).Operand).Object).Member.Name)
                {
                    return(ExpressionUtil.RemoveConversionsAndTypeAs(nullEqualConditionalMatch.IfNotNull));
                }
            }

            return(expr);
        }
        /// <summary>
        /// ConditionalExpression visit method
        /// </summary>
        /// <param name="c">The ConditionalExpression expression to visit</param>
        /// <returns>
        /// The visited ConditionalExpression expression
        /// </returns>
        internal override Expression VisitConditional(ConditionalExpression c)
        {
            var nullEqualConditionalMatch = ExpressionUtil.MatchNullEqualConditional(c);

            if (nullEqualConditionalMatch != null &&
                nullEqualConditionalMatch.ComparisonOperand.Type == typeof(String))
            {
                if (((MemberExpression)nullEqualConditionalMatch.ComparisonOperand).Member.Name == ((MemberExpression)((MethodCallExpression)((UnaryExpression)nullEqualConditionalMatch.IfNotNull).Operand).Object).Member.Name)
                {
                    return(ExpressionUtil.RemoveConversionsAndTypeAs(nullEqualConditionalMatch.IfNotNull));
                }
            }

            return(base.VisitConditional(c));
        }
        /// <summary>
        /// Optimizes the filter nullable boolean to condition.
        /// </summary>
        /// <param name="expr">The expr.</param>
        /// <returns></returns>
        private static Expression OptimizeFilterNullableBooleanToCondition(Expression expr)
        {
            if (expr.Type == typeof(bool))
            {
                var nullEqualConditionalMatch = ExpressionUtil.MatchNullEqualConditional(expr);
                if (nullEqualConditionalMatch != null &&
                    nullEqualConditionalMatch.ComparisonOperand.Type == typeof(bool?) &&
                    ExpressionUtil.IsFalseConstant(nullEqualConditionalMatch.IfNull) &&
                    ExpressionUtil.IsMemberAccess(nullEqualConditionalMatch.IfNotNull, "Value"))
                {
                    // (c == null) ? false : c.Value    (bool?)c
                    // =>
                    // c == (bool?)true
                    return(Expression.Equal(
                               nullEqualConditionalMatch.ComparisonOperand,
                               Expression.Constant(true, typeof(bool?))));
                }
            }

            return(expr);
        }