I'm still getting used to git, so I don't know how to create patches
on it yet.

I'm pasting here my temporary fix for the Skip/Take clauses when a
dialect support just constant limits.

Any advice is welcome.

using System.Linq.Expressions;
using NHibernate.Engine.Query;
using NHibernate.Param;
using Remotion.Linq.Clauses.ResultOperators;

namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
{
        public class ProcessSkip :
IResultOperatorProcessor<SkipResultOperator>
        {
                #region IResultOperatorProcessor<SkipResultOperator> Members

                public void Process(SkipResultOperator resultOperator,
QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
                {
                        VisitorParameters parameters = 
queryModelVisitor.VisitorParameters;
                        NamedParameter namedParameter;

#warning TEMP. FIX FOR DIALECTS THAT SUPPORT CONSTANT LIMIT ONLY
            /**
             * Temporary fix for Skip for dialects that support
constant limiting only
             * */
            if (parameters.SessionFactory.Dialect.SupportsLimit && !
parameters.SessionFactory.Dialect.SupportsVariableLimit)
            {
 
tree.AddSkipClause(tree.TreeBuilder.Constant(resultOperator.GetConstantCount()));
                return;
            }

            if
(parameters.ConstantToParameterMap.TryGetValue(resultOperator.Count as
ConstantExpression, out namedParameter))
                        {
                                parameters.RequiredHqlParameters.Add(new
NamedParameterDescriptor(namedParameter.Name, null, false));
 
tree.AddSkipClause(tree.TreeBuilder.Parameter(namedParameter.Name));
                        }
            else
            {
 
tree.AddSkipClause(tree.TreeBuilder.Constant(resultOperator.GetConstantCount()));
            }
                }

                #endregion
        }
}



using System.Linq.Expressions;
using NHibernate.Engine.Query;
using NHibernate.Param;
using Remotion.Linq.Clauses.ResultOperators;

namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
{
        public class ProcessTake :
IResultOperatorProcessor<TakeResultOperator>
        {
                #region IResultOperatorProcessor<TakeResultOperator> Members

                public void Process(TakeResultOperator resultOperator,
QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
                {
                        VisitorParameters parameters = 
queryModelVisitor.VisitorParameters;
                        NamedParameter namedParameter;

#warning TEMP. FIX FOR DIALECTS THAT SUPPORT CONSTANT LIMIT ONLY

            /**
             * Temporary fix for Take for dialects that support
constant limiting only
             * */
            if (parameters.SessionFactory.Dialect.SupportsLimit && !
parameters.SessionFactory.Dialect.SupportsVariableLimit)
            {
 
tree.AddTakeClause(tree.TreeBuilder.Constant(resultOperator.GetConstantCount()));
                return;
            }

                        if
(parameters.ConstantToParameterMap.TryGetValue(resultOperator.Count as
ConstantExpression, out namedParameter))
                        {
                                parameters.RequiredHqlParameters.Add(new
NamedParameterDescriptor(namedParameter.Name, null, false));
        
tree.AddTakeClause(tree.TreeBuilder.Parameter(namedParameter.Name));
                        }
                        else
                        {
        
tree.AddTakeClause(tree.TreeBuilder.Constant(resultOperator.GetConstantCount()));
                        }
                }

                #endregion
        }
}

Reply via email to