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) });
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); }