/// <summary> /// Return customized limit string (for paging queries) /// For performance reason the limit string is ommitted when querying the first page. /// </summary> /// <param name="querySqlString"></param> /// <param name="offset"></param> /// <param name="last"></param> /// <returns></returns> public override NHibernate.SqlCommand.SqlString GetLimitString(NHibernate.SqlCommand.SqlString querySqlString, int offset, int last) { if (!querySqlString.StartsWithCaseInsensitive("select ")) { throw new ArgumentException("querySqlString should start with select", "querySqlString"); } SqlString sqlString = querySqlString.Substring(6); string orderSql = querySqlString.SubstringStartingWithLast("order by").ToString(); if (orderSql.Length != 0) { sqlString = sqlString.Substring(0, (sqlString.Length - orderSql.Length) - 1); } SqlStringBuilder builder = new SqlStringBuilder(); int num = offset + 1; builder.Add("SELECT TOP ").Add(last.ToString()).Add(" ").Add(sqlString); if(offset > 0) builder.Add(" WITH FIRSTROW ").Add(num.ToString()); if (orderSql.Length > 0) { builder.Add(" ").Add(orderSql); } return builder.ToSqlString(); }