[英]Modify SQL in NHibernate
我需要知道如何修改sql,以添加到每个选择的sql代码中。 我的问题是,即使在“ like GROUP BY”之后,也需要在“ FROM table” +“ sql_code”之后添加此sql代码。
我知道我需要使用OnPrepareStatement,我只是不知道如何编辑SqlString来这样做!
我尝试过的一件事:
public override SqlString OnPrepareStatement(SqlString sql)
{
if (sql.Parts.Cast<string>().FirstOrDefault().Trim().ToLower() != "select")
{
return sql;
}
StringBuilder novaString = new StringBuilder(sql.ToString());
String corte = sql.SubstringStartingWithLast("where").ToString();
if (corte != "")
{
StringBuilder sb = new StringBuilder(corte);
sb.Insert(0, "with(nolock) ");
novaString.Replace(corte, sb.ToString());
}
else
{
novaString.Append(" with(nolock)");
}
return new SqlString(novaString.ToString());
}
谢谢 !
我参加聚会有点晚了,但这是我对我们的一些疑问的看法。 下面采用给定的sql语句,并在末尾附加一点:
public class OptionInterceptor: EmptyInterceptor
{
public override SqlString OnPrepareStatement(SqlString sql)
{
var parameters = sql.GetParameters();
var paramCount = parameters.Count();
if (paramCount > 0)
return sql;
string optionString = " OPTION (OPTIMIZE FOR (";
for (var i = 0; i < paramCount; i++)
{
var comma = i > 0 ? "," : string.Empty;
optionString = optionString + comma + "@p" + i + " UNKNOWN";
}
optionString = optionString + "))";
var builder = new SqlStringBuilder(sql);
builder.Add(optionString);
return builder.ToSqlString();
}
}
为时已晚,但仍然。 我必须在生成的sql中添加提示:
private class SqlLogger : EmptyInterceptor
{
private const string Select = "SELECT";
private const int SelectLen = 6;
private const string Hint = " /*+ dynamic_sampling(0) */";
private const char Param = '?';
public override SqlString OnPrepareStatement(SqlString sql)
{
var s = sql.ToString().ToUpper();
var start = s.IndexOf(Select, StringComparison.Ordinal);
if (start != -1)
s = s.Insert(SelectLen, Hint);
var builder = new SqlStringBuilder();
var parts = s.Split(Param);
for (var i = 0; i < parts.Length - 1; i++)
{
builder.Add(parts[i]);
builder.AddParameter();
}
builder.Add(parts.Last());
sql = builder.ToSqlString();
return sql;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.