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