NHibernate:DB2400Dialect:Dialect不支持变量限制

时间:2012-03-29 14:05:07

标签: nhibernate

我正在使用一个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()
}

1 个答案:

答案 0 :(得分:3)

经过大量研究后,我决定通过创建自己实现的自定义方言来解决这个问题,或者扩展现有的DB2400Dialect来实现 -

public SqlString GetLimitString(SqlString queryString, int? offset, int? limit, Parameter offsetParameter, Parameter limitParameter)

这将毫无意义,因为虽然iSeries允许使用

进行限制
... FETCH FIRST n ROWS ONLY

语法,它没有用于执行偏移的等效语法...因此,修复损坏的位没有多大意义。