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