Beispiel #1
0
 protected override Expression VisitParameter(ParameterExpression parameterExpression)
 {
     if (_fbOptions.ExplicitParameterTypes)
     {
         Sql.Append("CAST(");
     }
     base.VisitParameter(parameterExpression);
     if (_fbOptions.ExplicitParameterTypes)
     {
         Sql.Append(" AS ");
         if (parameterExpression.Type == typeof(string))
         {
             if (ParameterValues.TryGetValue(parameterExpression.Name, out var parameterValue))
             {
                 Sql.Append(((IFbTypeMappingSource)Dependencies.TypeMappingSource).StringParameterQueryType((string)parameterValue));
                 IsCacheable = false;
             }
             else
             {
                 Sql.Append(((IFbTypeMappingSource)Dependencies.TypeMappingSource).StringParameterQueryType());
             }
         }
         else
         {
             Sql.Append(Dependencies.TypeMappingSource.GetMapping(parameterExpression.Type).StoreType);
         }
         Sql.Append(")");
     }
     return(parameterExpression);
 }
        protected override Expression VisitParameter(ParameterExpression parameterExpression)
        {
            if (_noBackslashEscapes)
            {
                //instead of having MySqlConnector replace parameter placeholders with escaped values
                //(causing "parameterized" queries to fail with NO_BACKSLASH_ESCAPES),
                //directly insert the value with only replacing ' with ''
                Check.NotNull(parameterExpression, nameof(parameterExpression));
                object value;
                var    isRegistered = ParameterValues.TryGetValue(parameterExpression.Name, out value);
                if (isRegistered && value is string)
                {
                    return(VisitConstant(Expression.Constant(value)));
                }
            }

            return(base.VisitParameter(parameterExpression));
        }
Beispiel #3
0
        public override Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression)
        {
            switch (sqlFunctionExpression.FunctionName)
            {
            case "EXTRACT":
                Sql.Append(sqlFunctionExpression.FunctionName);
                Sql.Append("(");

                Visit(sqlFunctionExpression.Arguments[0]);

                Sql.Append(" FROM ");

                Visit(sqlFunctionExpression.Arguments[1]);

                Sql.Append(")");

                return(sqlFunctionExpression);

            case "CAST":
                Sql.Append(sqlFunctionExpression.FunctionName);
                Sql.Append("(");

                Visit(sqlFunctionExpression.Arguments[0]);

                Sql.Append(" AS ");

                Visit(sqlFunctionExpression.Arguments[1]);

                Sql.Append(")");

                return(sqlFunctionExpression);

            case "AVG" when sqlFunctionExpression.Type == typeof(decimal):
            case "SUM" when sqlFunctionExpression.Type == typeof(decimal):
                Sql.Append("CAST(");

                base.VisitSqlFunction(sqlFunctionExpression);

                Sql.Append(" AS NUMBER(29,4))");

                return(sqlFunctionExpression);

            case "INSTR":
                if (sqlFunctionExpression.Arguments[1] is ParameterExpression parameterExpression &&
                    ParameterValues.TryGetValue(parameterExpression.Name, out var value) &&
                    ((string)value)?.Length == 0)
                {
                    return(Visit(Expression.Constant(1)));
                }

                break;

            case "ADD_MONTHS":
                Sql.Append("CAST(");

                base.VisitSqlFunction(sqlFunctionExpression);

                Sql.Append(" AS TIMESTAMP)");

                return(sqlFunctionExpression);
            }

            return(base.VisitSqlFunction(
                       // non-instance & non-built-in functions without schema needs to be delimited
                       (!_builtInFunctions.Contains(sqlFunctionExpression.FunctionName) &&
                        sqlFunctionExpression.Instance == null)
                    ? sqlFunctionExpression.IsNiladic
                        ? new SqlFunctionExpression(
                           SqlGenerator.DelimitIdentifier(sqlFunctionExpression.FunctionName),
                           sqlFunctionExpression.Type,
                           sqlFunctionExpression.IsNiladic)
                        : new SqlFunctionExpression(
                           SqlGenerator.DelimitIdentifier(sqlFunctionExpression.FunctionName),
                           sqlFunctionExpression.Type,
                           /* schema:*/ null,
                           sqlFunctionExpression.Arguments)
                    : sqlFunctionExpression));
        }
Beispiel #4
0
        public override Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression)
        {
            switch (sqlFunctionExpression.FunctionName)
            {
            case "EXTRACT":
            {
                Sql.Append(sqlFunctionExpression.FunctionName);
                Sql.Append("(");

                Visit(sqlFunctionExpression.Arguments[0]);

                Sql.Append(" FROM ");

                Visit(sqlFunctionExpression.Arguments[1]);

                Sql.Append(")");

                return(sqlFunctionExpression);
            }

            case "CAST":
            {
                Sql.Append(sqlFunctionExpression.FunctionName);
                Sql.Append("(");

                Visit(sqlFunctionExpression.Arguments[0]);

                Sql.Append(" AS ");

                Visit(sqlFunctionExpression.Arguments[1]);

                Sql.Append(")");

                return(sqlFunctionExpression);
            }

            case "AVG" when sqlFunctionExpression.Type == typeof(decimal):
            case "SUM" when sqlFunctionExpression.Type == typeof(decimal):
            {
                Sql.Append("CAST(");

                base.VisitSqlFunction(sqlFunctionExpression);

                Sql.Append(" AS DECIMAL(29,4))");

                return(sqlFunctionExpression);
            }

            case "INSTR":
            {
                if (sqlFunctionExpression.Arguments[1] is ParameterExpression parameterExpression &&
                    ParameterValues.TryGetValue(parameterExpression.Name, out var value) &&
                    (string)value == string.Empty)
                {
                    return(Visit(Expression.Constant(1)));
                }

                break;
            }

            case "ADD_MONTHS":
            {
                Sql.Append("CAST(");

                base.VisitSqlFunction(sqlFunctionExpression);

                Sql.Append(" AS TIMESTAMP)");

                return(sqlFunctionExpression);
            }
            }

            return(base.VisitSqlFunction(sqlFunctionExpression));
        }
		/// <summary>
		/// 重写Sql函数
		/// </summary>
		/// <param name="sqlFunctionExpression">Sql函数表达式</param>
		/// <returns></returns>
		public override Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression)
		{
			try
			{
				if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Entry, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.VisitSqlFunction);
				}

				switch (sqlFunctionExpression.FunctionName)
				{
				case "EXTRACT":
				{
					Sql.Append(sqlFunctionExpression.FunctionName);
					Sql.Append("(");
					Visit(sqlFunctionExpression.Arguments[0]);
					Sql.Append(" FROM ");
					Visit(sqlFunctionExpression.Arguments[1]);
					Sql.Append(")");
					return sqlFunctionExpression;
				}
				case "CAST":
				{
					Sql.Append(sqlFunctionExpression.FunctionName);
					Sql.Append("(");
					Visit(sqlFunctionExpression.Arguments[0]);
					Sql.Append(" AS ");
					Visit(sqlFunctionExpression.Arguments[1]);
					Sql.Append(")");
					return sqlFunctionExpression;
				}
				case "AVG":
				{
					if (!(sqlFunctionExpression.Type == typeof(decimal)))
					{
						break;
					}
					Sql.Append("CAST(");
					base.VisitSqlFunction(sqlFunctionExpression);
					Sql.Append(" AS NUMBER(29,4))");
					return sqlFunctionExpression;
				}
				case "SUM":
				{
					if (!(sqlFunctionExpression.Type == typeof(decimal)))
					{
						break;
					}
					Sql.Append("CAST(");
					base.VisitSqlFunction(sqlFunctionExpression);
					Sql.Append(" AS NUMBER(29,4))");
					return sqlFunctionExpression;
				}
				case "INSTR":
				{
					ParameterExpression parameterExpression;
					if ((parameterExpression = (sqlFunctionExpression.Arguments[1] as ParameterExpression)) != null && ParameterValues.TryGetValue(parameterExpression.Name, out object value))
					{
						string obj = (string)value;
						if (obj != null && obj.Length == 0)
						{
							return Visit(Expression.Constant(1));
						}
					}
					break;
				}
				case "ADD_MONTHS":
					{
						Sql.Append("CAST(");
						base.VisitSqlFunction(sqlFunctionExpression);
						Sql.Append(" AS TIMESTAMP)");
						return sqlFunctionExpression;
					}
				}

				return base.VisitSqlFunction((!_builtInFunctions.Contains(sqlFunctionExpression.FunctionName) && sqlFunctionExpression.Instance == null) ? new SqlFunctionExpression(SqlGenerator.DelimitIdentifier(sqlFunctionExpression.FunctionName), sqlFunctionExpression.Type, null, sqlFunctionExpression.Arguments) : sqlFunctionExpression);
			}
			catch (Exception ex)
			{
				if (Check.IsErrorEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Error, OracleTraceTag.Error, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.VisitSqlFunction, ex.ToString());
				}
				throw;
			}
			finally
			{
				if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Exit, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.VisitSqlFunction);
				}
			}
		}