Пример #1
0
        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, EntityMode.Poco));
                    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, EntityMode.Poco));
                    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.
                return(dialect.GetLimitString(subquery, skip, take, skipSqlParameter, takeSqlParameter));
            }
            return(subquery);
        }