2012-03-29 4 views
2

Я работаю с проектом архитектуры S # arp, который включает в себя некоторые задачи базы данных, которые работали в прошлом. В частности:NHibernate: DB2400Dialect: Dialect не поддерживает переменные ограничения

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?

EDIT:

Кстати, это выражение отладки строка из вызова NHibernate.Linq.DefaultQueryProvider:

.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() 
} 

ответ

3

После долгих исследований я решил, что в то время как я мог бы решить этот вопрос, либо создавая свой собственный диалект, который реализует - или расширить существующий DB2400Dialect реализовать -

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

, что было бы бессмысленно, так как в то время как ISeries позволяет ограничение с синтаксисом

... FETCH FIRST n ROWS ONLY 

, он не имеет никакого эквивалентного синтаксиса делает смещение ... поэтому, нет особого смысла для фиксации сломанных бит.

+0

Я просто попробовал просто настроить тестовый стенд. Мне потребовалось некоторое время, чтобы выяснить, что вы говорите в своем вопросе и ответе. Проведя несколько часов или около того, переступив через отладчик и все, я наконец понял, что вы имеете в виду. Хотя, похоже, это проблема только с помощью провайдера linq (что для меня неудачно, так как использование linq было целым пунктом моего упражнения). –

Смежные вопросы