我正在使用一个S#arp架构项目,其中包括一些过去曾有过的数据库任务。具体做法是:
var principals = _principalTasks.GetAll().AsPagination(page, limit);
任务定义为:
public IQueryable<Principal> GetAll()
{
return _principalRepository.FindAll().OrderBy(o => o.PrincipalName.ToLower());
}
这有效地使用了NHibernate.Linq。
这是使用DB2400Dialect。现在它抛出:
System.NotSupportedException: Dialect does not support variable limits.
at NHibernate.Dialect.Dialect.GetLimitString(SqlString queryString, Nullable`1 offset, Nullable`1 limit, Parameter offsetParameter, Parameter limitParameter)
at NHibernate.Hql.Ast.ANTLR.SqlGenerator.GetSqlStringWithLimitsIfNeeded(QueryWriter queryWriter)
at NHibernate.Hql.Ast.ANTLR.SqlGenerator.EndQuery()
at NHibernate.Hql.Ast.ANTLR.SqlGenerator.selectStatement()
at NHibernate.Hql.Ast.ANTLR.SqlGenerator.statement()
at NHibernate.Hql.Ast.ANTLR.HqlSqlGenerator.Generate()
.
.
.
看起来SQLGenerator坚持参数化跳过并采用这种方言不支持的参数。
有没有办法绕过这个或者这是一个NHibernate错误?
编辑:
BTW,这是来自NHibernate.Linq.DefaultQueryProvider调用的Expression Debug字符串:
.Call System.Linq.Queryable.Take(
.Call System.Linq.Queryable.Skip(
.Call System.Linq.Queryable.OrderBy(
.Constant<NHibernate.Linq.NhQueryable`1[SolutionExample.Domain.Principal]>(NHibernate.Linq.NhQueryable`1[SolutionExample.Domain.Principal]),
'(.Lambda #Lambda1<System.Func`2[SolutionExample.Domain.Principal,System.String]>)),
0),
25)
.Lambda #Lambda1<System.Func`2[SolutionExample.Domain.Principal,System.String]>(SolutionExample.Domain.Principal $o) {
.Call ($o.PrincipalName).ToLower()
}
答案 0 :(得分:3)
经过大量研究后,我决定通过创建自己实现的自定义方言来解决这个问题,或者扩展现有的DB2400Dialect来实现 -
public SqlString GetLimitString(SqlString queryString, int? offset, int? limit, Parameter offsetParameter, Parameter limitParameter)
这将毫无意义,因为虽然iSeries允许使用
进行限制... FETCH FIRST n ROWS ONLY
语法,它没有用于执行偏移的等效语法...因此,修复损坏的位没有多大意义。