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