예제 #1
0
        private SqlExpression ApplyTypeMappingOnMySqlBinary(
            MySqlBinaryExpression sqlBinaryExpression,
            RelationalTypeMapping typeMapping)
        {
            var left  = sqlBinaryExpression.Left;
            var right = sqlBinaryExpression.Right;

            Type resultType;
            RelationalTypeMapping resultTypeMapping;
            RelationalTypeMapping inferredTypeMapping;

            switch (sqlBinaryExpression.OperatorType)
            {
            case MySqlBinaryExpressionOperatorType.IntegerDivision:
            {
                inferredTypeMapping = typeMapping ?? ExpressionExtensions.InferTypeMapping(left, right);
                resultType          = left.Type;
                resultTypeMapping   = inferredTypeMapping;
            }
            break;

            default:
                throw new InvalidOperationException("Incorrect OperatorType for MySqlBinaryExpression");
            }

            return(new MySqlBinaryExpression(
                       sqlBinaryExpression.OperatorType,
                       ApplyTypeMapping(left, inferredTypeMapping),
                       ApplyTypeMapping(right, inferredTypeMapping),
                       resultType,
                       resultTypeMapping));
        }
        public virtual Expression VisitMySqlBinaryExpression(
            [NotNull] MySqlBinaryExpression mySqlBinaryExpression)
        {
            Check.NotNull(mySqlBinaryExpression, nameof(mySqlBinaryExpression));

            Sql.Append("BINARY ");

            Visit(mySqlBinaryExpression.ValueExpression);

            return(mySqlBinaryExpression);
        }
 private SqlExpression ApplyNewTypeMapping(SqlExpression sqlExpression, RelationalTypeMapping typeMapping)
 {
     return(sqlExpression switch
     {
         MySqlComplexFunctionArgumentExpression e => ApplyTypeMappingOnComplexFunctionArgument(e),
         MySqlCollateExpression e => ApplyTypeMappingOnCollate(e),
         MySqlRegexpExpression e => ApplyTypeMappingOnRegexp(e),
         MySqlBinaryExpression e => ApplyTypeMappingOnMySqlBinary(e, typeMapping),
         MySqlMatchExpression e => ApplyTypeMappingOnMatch(e),
         MySqlJsonArrayIndexExpression e => e.ApplyTypeMapping(typeMapping),
         _ => base.ApplyTypeMapping(sqlExpression, typeMapping)
     });
예제 #4
0
        public Expression VisitMySqlBinaryExpression(MySqlBinaryExpression mySqlBinaryExpression)
        {
            Sql.Append("(");
            Visit(mySqlBinaryExpression.Left);
            Sql.Append(")");

            switch (mySqlBinaryExpression.OperatorType)
            {
            case MySqlBinaryExpressionOperatorType.IntegerDivision:
                Sql.Append(" DIV ");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            Sql.Append("(");
            Visit(mySqlBinaryExpression.Right);
            Sql.Append(")");

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

                var charIndexExpression = Expression.GreaterThan(
                    new SqlFunctionExpression("LOCATE", typeof(int), new[] { binaryExpression, methodCallExpression.Object }),
                    Expression.Constant(0));

                return
                    (patternConstantExpression != null
                        ? (string)patternConstantExpression.Value == string.Empty
                            ? (Expression)Expression.Constant(true)
                            : charIndexExpression
                        : Expression.OrElse(
                         charIndexExpression,
                         Expression.Equal(patternExpression, Expression.Constant(string.Empty))));
            }

            return(null);
        }