NHibernate拦截器内部没有设置参数

Parameters are not set inside NHibernate interceptor

我正在尝试使用拦截器为某些查询添加 WITH (NO LOCK)(并非针对所有查询,因此 ReadUncommitted 不是一个选择)。 代码如下所示:

var rawSql = sql.ToString();
if (!rawSql.Contains(IQueryOverExtensions.QueryHintNoLockString))
    return sql;

var noWhere = rawSql.Substring(0, rawSql.IndexOf(WhereKeyword, StringComparison.InvariantCulture));
var from = noWhere.Substring(noWhere.IndexOf(FromKeyword, StringComparison.InvariantCulture));
var fromWithNoLock = from.Replace("_ ", $"_ {WithNoLock} ");

var sqlWithNoLock = rawSql.Replace(from, fromWithNoLock);

return base.OnPrepareStatement(new SqlString(sqlWithNoLock));

在这里,我从 FROM 子句到 WHERE 子句,并为每个别名添加 WITH (NO LOCK)

问题是,最后的SQL的参数都是"?"并抛出 SQL 无效的异常。为什么没有填写参数以及如何解决? 提前致谢

终于明白了。我必须通过调用 sql.GetParameterCount() 来获取参数数量,然后用 @p0、@p1、@p2 等替换所有问号