Index: NHibernate/Engine/SubselectFetch.cs =================================================================== --- NHibernate/Engine/SubselectFetch.cs (revision 3580) +++ NHibernate/Engine/SubselectFetch.cs (working copy) @@ -42,36 +42,15 @@ public SqlString ToSubselectString(string ukname) { string[] joinColumns = ukname == null - ? StringHelper.Qualify(alias, loadable.IdentifierColumnNames) - : ((IPropertyMapping) loadable).ToColumns(alias, ukname); + ? StringHelper.Qualify(alias, loadable.IdentifierColumnNames) + : ((IPropertyMapping)loadable).ToColumns(alias, ukname); SqlString sqlString = new SqlStringBuilder().Add("select ").Add(StringHelper.Join(", ", joinColumns)).Add(queryString).ToSqlString(); - RowSelection selection = queryParameters.RowSelection; - - bool useLimit = Loader.Loader.UseLimit(selection, dialect); - bool hasFirstRow = Loader.Loader.GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && useLimit && dialect.SupportsLimitOffset; - - if ((useLimit || hasFirstRow) == false) - { - return sqlString; - } - - sqlString = AppendOrderByIfNeeded(sqlString); - - return - dialect.GetLimitString(sqlString.Trim(), useOffset ? Loader.Loader.GetFirstRow(selection) : 0, - Loader.Loader.GetMaxOrLimit(dialect, selection)); + return sqlString; } - private SqlString AppendOrderByIfNeeded(SqlString sqlString) - { - SqlString orderByOrEmpty = queryParameters.FilteredSQL.SubstringStartingWithLast("order by"); - return sqlString.Append(orderByOrEmpty); - } - public override string ToString() { return "SubselectFetch(" + queryString + ')'; Index: NHibernate/Loader/Collection/SubselectOneToManyLoader.cs =================================================================== --- NHibernate/Loader/Collection/SubselectOneToManyLoader.cs (revision 3580) +++ NHibernate/Loader/Collection/SubselectOneToManyLoader.cs (working copy) @@ -16,6 +16,7 @@ private readonly IDictionary namedParameters; private readonly IType[] types; private readonly object[] values; + private readonly RowSelection selection; public SubselectOneToManyLoader(IQueryableCollection persister, SqlString subquery, ICollection entityKeys, QueryParameters queryParameters, IDictionary namedParameterLocMap, @@ -28,7 +29,7 @@ { keys[i++] = entityKey.Identifier; } - + selection = queryParameters.RowSelection; namedParameters = queryParameters.NamedParameters; types = queryParameters.FilteredPositionalParameterTypes; values = queryParameters.FilteredPositionalParameterValues; @@ -40,6 +41,11 @@ LoadCollectionSubselect(session, keys, values, types, namedParameters, KeyType); } + protected override RowSelection GetRowSelection() + { + return selection; + } + public override int[] GetNamedParameterLocs(string name) { return namedParameterLocMap[name]; Index: NHibernate/Loader/Loader.cs =================================================================== --- NHibernate/Loader/Loader.cs (revision 3580) +++ NHibernate/Loader/Loader.cs (working copy) @@ -1179,7 +1179,7 @@ /// The selection criteria /// The dialect /// The appropriate value to bind into the limit clause. - internal static int GetMaxOrLimit(Dialect.Dialect dialect, RowSelection selection) + private static int GetMaxOrLimit(Dialect.Dialect dialect, RowSelection selection) { int firstRow = GetFirstRow(selection); int lastRow = selection.MaxRows; @@ -1576,8 +1576,10 @@ { try { + QueryParameters parameters = new QueryParameters(parameterTypes, parameterValues, namedParameters, ids); + parameters.RowSelection = GetRowSelection(); DoQueryAndInitializeNonLazyCollections(session, - new QueryParameters(parameterTypes, parameterValues, namedParameters, ids), + parameters, true); } catch (HibernateException) @@ -1594,6 +1596,11 @@ } } + protected virtual RowSelection GetRowSelection() + { + return null; + } + /// /// Return the query results, using the query cache, called /// by subclasses that implement cacheable queries