How do add NOLOCK with nHibernate?

后端 未结 7 1227
再見小時候
再見小時候 2020-11-29 03:43

How do you add NOLOCK when using nhibernate? (criteria query)

7条回答
  •  时光取名叫无心
    2020-11-29 04:13

    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.

提交回复
热议问题