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
}
}