protected SqlString GetSubSelectWithLimits(SqlString subquery, ICollection <IParameterSpecification> parameterSpecs, RowSelection processedRowSelection, IDictionary <string, TypedValue> parameters) { ISessionFactoryImplementor sessionFactory = Factory; Dialect.Dialect dialect = sessionFactory.Dialect; RowSelection selection = processedRowSelection; bool useLimit = UseLimit(selection, dialect); if (useLimit) { bool hasFirstRow = GetFirstRow(selection) > 0; bool useOffset = hasFirstRow && dialect.SupportsLimitOffset; int max = GetMaxOrLimit(dialect, selection); int? skip = useOffset ? (int?)dialect.GetOffsetValue(GetFirstRow(selection)) : null; int? take = max != int.MaxValue ? (int?)max : null; Parameter skipSqlParameter = null; Parameter takeSqlParameter = null; if (skip.HasValue) { string skipParameterName = "nhsubselectskip"; var skipParameter = new NamedParameterSpecification(1, 0, skipParameterName) { ExpectedType = NHibernateUtil.Int32 }; skipSqlParameter = Parameter.Placeholder; skipSqlParameter.BackTrack = skipParameter.GetIdsForBackTrack(sessionFactory).First(); parameters.Add(skipParameterName, new TypedValue(skipParameter.ExpectedType, skip.Value)); parameterSpecs.Add(skipParameter); } if (take.HasValue) { string takeParameterName = "nhsubselecttake"; var takeParameter = new NamedParameterSpecification(1, 0, takeParameterName) { ExpectedType = NHibernateUtil.Int32 }; takeSqlParameter = Parameter.Placeholder; takeSqlParameter.BackTrack = takeParameter.GetIdsForBackTrack(sessionFactory).First(); parameters.Add(takeParameterName, new TypedValue(takeParameter.ExpectedType, take.Value)); parameterSpecs.Add(takeParameter); } // The dialect can move the given parameters where he need, what it can't do is generates new parameters loosing the BackTrack. SqlString result; if (TryGetLimitString(dialect, subquery, skip, take, skipSqlParameter, takeSqlParameter, out result)) { return(result); } } return(subquery); }
protected object GetPagingValue(object value, Dialect.Dialect dialect, QueryParameters queryParameters) { if (isTakeParameter) { int skipParameterValue = 0; if (skipParameter != null) { skipParameterValue = skipParameter.GetSkipValue(queryParameters); } return(dialect.GetLimitValue(skipParameterValue, (int)value)); } if (isSkipParameter) { return(dialect.GetOffsetValue((int)value)); } return(value); }