private void SqlReplace(string query, TextWriter builder) { SqlReplace(query, '@', builder, p => { object value; if (TryGetParamValue(p, out value)) { Func <string, string> finalAction = s => s; var inClause = false; if (builder.ToString().EndsWith(" in ")) { finalAction = s => "(" + s + ")"; inClause = true; } else if (builder.ToString().EndsWith(" in (")) { inClause = true; } IFormattable num; if (value == null #if DBDATA || value == DBNull.Value #endif ) { return(finalAction("null")); } else if (ServerContext.TryCastNumber(value, out num)) { return(finalAction(_sqlFormatter.Format(num))); } else if (value is string) { return(finalAction(SqlFormatter.Quote(ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o))))); } else if (inClause && value is IEnumerable) { return(finalAction(ServerContext.RenderSqlEnum(value, true, o => _sqlFormatter.Format(o)))); } else if (value is DateTime || value is bool || value is Guid) { return(finalAction("'" + ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o)) + "'")); } else { return(finalAction(SqlFormatter.Quote(ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o))))); } } else { return("@" + p); } }); }
private Parameter RenderValue(string context, string content) { object value; var param = new Parameter(); if (content.IsNullOrWhiteSpace()) { return(param.WithValue(content)); } else if (TryFillParameter(content, param) && TryGetParamValue(param.Name, out value)) { param.Original = value; if (param.IsRaw) { return(param.WithValue((param.Original ?? "").ToString())); } if (context == "le" && value is DateOffset offset1) { value = offset1.AsDate(_context.Now(), true); } else if (context == "lt" && value is DateOffset offset2) { value = offset2.AsDate(_context.Now(), true).AddMilliseconds(1); } switch (context) { case "idlist": return(param.WithValue(ServerContext.RenderSqlEnum(value, false, o => _context.Format(o)))); case "in": case "not in": return(param.WithValue(ServerContext.RenderSqlEnum(value, true, o => _context.Format(o)))); case "like": case "not like": // Do something useful with context return(param.WithValue(ServerContext.RenderSqlEnum(value, false, o => _context.Format(o)))); default: return(param.WithValue(ServerContext.RenderSqlEnum(value, false, o => _context.Format(o)))); } } else if (context == "between" || context == "not between") { // Do something useful here return(param.WithValue(content)); } else if (context == "sql" || context == "where") { return(param.WithValue(SqlReplace(content))); } else if ((context == "in" || context == "not in") && content.TrimStart()[0] == '(') { content = content.Trim(); if (content.Length > 2 && content[1] == '@') { // Dapper is trying to be too helpful with parameter expansion return(param.WithValue(SqlReplace(content.TrimStart('(').TrimEnd(')')))); } else { return(param.WithValue(SqlReplace(content))); } } else { return(param.WithValue(content)); } }