How do you add NOLOCK when using nhibernate? (criteria query)
I have taken @cbp answer and changed it a bit:
private static SqlString ApplyQueryHintNoLock(SqlString sql)
{
var sqlString = sql.ToString();
if (_cache.Get(sqlString) is SqlString cachedSql)
{
//return cachedSql;
}
var regex1 = new Regex(@" FROM\s+[a-zA-Z1-9_.]*\s+([a-zA-Z1-9_.]*)", RegexOptions.IgnoreCase);
var regex2 = new Regex(@"(?: INNER JOIN| LEFT OUTER JOIN)\s+[a-zA-Z1-9_.]*\s+([a-zA-Z1-9_.]*) ON", RegexOptions.IgnoreCase);
var tableAliasMatches = regex1.Matches(sqlString);
var joinsAliasMatches = regex2.Matches(sqlString);
var combined = tableAliasMatches.OfType()
.Concat(joinsAliasMatches.OfType())
.Where(m => m.Success)
.OrderBy(m=>m.Index);
var noLockLength = " WITH (NOLOCK)".Length;
var q = 0;
foreach (Match aliasMatch in combined)
{
var alias = aliasMatch.Groups[1].Value;
var aliasIndex = aliasMatch.Groups[1].Index + q + alias.Length;
sql = sql.Insert(aliasIndex, " WITH (NOLOCK)");
q += noLockLength;
}
_cache.Set(sqlString, sql, DateTimeOffset.Now.AddHours(3));
return sql;
}
internal static string GetQueryHintNoLock()
{
return _queryHintNoLockCommentString;
}
this way it will add no lock to all tables and inner joins in the query.
this is good for all of you using the unit of work pattern.