Nhibernate为查询添加选项

Nhibernate为查询添加选项,nhibernate,Nhibernate,我最近遇到了Nhibernate生成的SQL的性能问题,如中所述 我还发现了一个链接,描述了一位也是唯一一位杰夫·阿特伍德的类似经历 有人知道是否有必要在Nhibernate中添加“优化Uknown”选项吗? 您可以考虑扩展MSSQL方言或 实现IConnectionProvider以注入您自己的commandwrapper,它在调用ExecuteReader()时添加提示 这个例子有点冗长: public class OptionInterceptor: EmptyInterceptor

我最近遇到了Nhibernate生成的SQL的性能问题,如中所述

我还发现了一个链接,描述了一位也是唯一一位杰夫·阿特伍德的类似经历

有人知道是否有必要在Nhibernate中添加“优化Uknown”选项吗?

  • 您可以考虑扩展MSSQL方言或
  • 实现IConnectionProvider以注入您自己的commandwrapper,它在调用
    ExecuteReader()
    时添加提示

这个例子有点冗长:

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

我相信您也可以简单地附加
“OPTION(OPTIMIZE FOR UNKNOWN)”
,在这种情况下,所有参数都被认为是未知的(无需指定所有参数)。另外,如果(sql.GetParameterCount()==0)返回sql,它不应该是
?@Groo是的,是的
configuration.ExposeConfiguration(x =>
    {
        x.SetInterceptor(new OptionInterceptor());
    });