예제 #1
0
        public virtual Expression Translate(MethodCallExpression methodCallExpression)
        {
            if (Equals(methodCallExpression.Method, _methodInfo))
            {
                var patternExpression = methodCallExpression.Arguments[0];

                var endsWithExpression = new NullCompensatedExpression(
                    Expression.Equal(
                        new SqlFunctionExpression(
                            "SUBSTR",
                            // ReSharper disable once PossibleNullReferenceException
                            methodCallExpression.Object.Type,
                            new[]
                {
                    methodCallExpression.Object,
                    Expression.Negate(
                        new SqlFunctionExpression("LENGTH", typeof(int), new[] { patternExpression }))
                }),
                        patternExpression));

                return(patternExpression is ConstantExpression patternConstantExpression
                    ? (string)patternConstantExpression.Value == string.Empty
                        ? (Expression)Expression.Constant(true)
                        : endsWithExpression
                    : Expression.OrElse(
                           endsWithExpression,
                           Expression.Equal(patternExpression, Expression.Constant(string.Empty))));
            }

            return(null);
        }
예제 #2
0
        /// <summary>
        /// 转换
        /// </summary>
        /// <param name="methodCallExpression">方法调用表达式</param>
        /// <returns></returns>
        public virtual Expression Translate(MethodCallExpression methodCallExpression)
        {
            if (object.Equals(methodCallExpression.Method, _methodInfo))
            {
                Expression expression = methodCallExpression.Arguments[0];
                NullCompensatedExpression nullCompensatedExpression = new NullCompensatedExpression(Expression.Equal(new SqlFunctionExpression("SUBSTR", methodCallExpression.Object.Type, new Expression[2]
                {
                    methodCallExpression.Object,
                    Expression.Negate(new SqlFunctionExpression("LENGTH", typeof(int), new Expression[1]
                    {
                        expression
                    }))
                }), expression));

                ConstantExpression constantExpression;
                if ((constantExpression = (expression as ConstantExpression)) == null)
                {
                    return(Expression.OrElse(nullCompensatedExpression, Expression.Equal(expression, Expression.Constant(string.Empty))));
                }

                string obj = (string)constantExpression.Value;
                if (obj == null || obj.Length != 0)
                {
                    return(nullCompensatedExpression);
                }
                return(Expression.Constant(true));
            }
            return(null);
        }
예제 #3
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        public virtual Expression Translate(
            MethodCallExpression methodCallExpression,
            IDiagnosticsLogger <DbLoggerCategory.Query> logger)
        {
            if (Equals(methodCallExpression.Method, _methodInfo))
            {
                var patternExpression = methodCallExpression.Arguments[0];

                var endsWithExpression = new NullCompensatedExpression(
                    Expression.Equal(
                        new SqlFunctionExpression(
                            "RIGHT",
                            // ReSharper disable once PossibleNullReferenceException
                            methodCallExpression.Object.Type,
                            new[] { methodCallExpression.Object, new SqlFunctionExpression("LEN", typeof(int), new[] { patternExpression }) }),
                        patternExpression));

                return(patternExpression is ConstantExpression patternConstantExpression
                    ? ((string)patternConstantExpression.Value)?.Length == 0
                        ? (Expression)Expression.Constant(true)
                        : endsWithExpression
                    : Expression.OrElse(
                           endsWithExpression,
                           Expression.Equal(patternExpression, Expression.Constant(string.Empty))));
            }

            return(null);
        }
예제 #4
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected override Expression VisitExtension(Expression expression)
        {
            var selectExpression = expression as SelectExpression;

            if (selectExpression?.Predicate != null)
            {
                var predicate = new EqualityPredicateInExpressionOptimizer().Visit(selectExpression.Predicate);

                var predicateNegationExpressionOptimizer = new PredicateNegationExpressionOptimizer();

                predicate = predicateNegationExpressionOptimizer.Visit(predicate);

                predicate = new PredicateReductionExpressionOptimizer().Visit(predicate);

                predicate = new EqualityPredicateExpandingVisitor().Visit(predicate);

                predicate = predicateNegationExpressionOptimizer.Visit(predicate);

                if (_useRelationalNulls)
                {
                    predicate = new NullCompensatedExpression(predicate);
                }

                selectExpression.Predicate = predicate;
            }
            else if (expression is PredicateJoinExpressionBase joinExpression)
            {
                joinExpression.Predicate = new DiscriminatorPredicateOptimizingVisitor().Visit(joinExpression.Predicate);

                joinExpression.Predicate = new EqualityPredicateInExpressionOptimizer().Visit(joinExpression.Predicate);
            }

            return(base.VisitExtension(expression));
        }
        public virtual Expression Translate(MethodCallExpression methodCallExpression)
        {
            if (Equals(methodCallExpression.Method, _methodInfo))
            {
                var patternExpression         = methodCallExpression.Arguments[0];
                var patternConstantExpression = patternExpression as ConstantExpression;

                var endsWithExpression = new NullCompensatedExpression(
                    Expression.Equal(
                        new SqlFunctionExpression(
                            "RIGHT",
                            methodCallExpression.Object.Type,
                            new[]
                {
                    methodCallExpression.Object,
                    new SqlFunctionExpression("CHARACTER_LENGTH", typeof(int), new[] { patternExpression })
                }),
                        patternExpression));

                return(patternConstantExpression != null
                    ? (string)patternConstantExpression.Value == string.Empty
                        ? (Expression)Expression.Constant(true)
                        : endsWithExpression
                    : Expression.OrElse(
                           endsWithExpression,
                           Expression.Equal(patternExpression, Expression.Constant(string.Empty))));
            }
            return(null);
        }
        private static Expression MakeEndsWithExpressionImpl(
            [NotNull] Expression target,
            [NotNull] Expression suffix,
            [NotNull] Expression originalSuffix)
        {
            var endsWithExpression =
                new NullCompensatedExpression(Expression.Equal(
                                                  new SqlFunctionExpression(
                                                      "RIGHT",
                                                      target.Type,
                                                      new[]
            {
                target,
                CharLength(suffix)
            }),
                                                  suffix));

            if (originalSuffix is ConstantExpression constantSuffix)
            {
                return((string)constantSuffix.Value == string.Empty
                    ? (Expression)Expression.Constant(true)
                    : endsWithExpression);
            }
            else
            {
                return(Expression.OrElse(
                           endsWithExpression,
                           Expression.Equal(originalSuffix, Expression.Constant(string.Empty))));
            }
        }