NHibernate:db2400方言:方言不支持变量限制
我正在与一个S#arp体系结构项目合作,该项目包括一些在过去工作过的数据库任务。具体而言:NHibernate:db2400方言:方言不支持变量限制,nhibernate,Nhibernate,我正在与一个S#arp体系结构项目合作,该项目包括一些在过去工作过的数据库任务。具体而言: var principals = _principalTasks.GetAll().AsPagination(page, limit); 其中任务定义为: public IQueryable<Principal> GetAll() { return _principalRepository.FindAll().OrderBy(o => o.Princip
var principals = _principalTasks.GetAll().AsPagination(page, limit);
其中任务定义为:
public IQueryable<Principal> GetAll()
{
return _principalRepository.FindAll().OrderBy(o => o.PrincipalName.ToLower());
}
看起来SQLGenerator坚持参数化skip和take参数,而这种方言不支持这些参数
有办法解决这个问题吗?还是这是一个NHibernate bug
编辑:
顺便说一句,这是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()
}
.Call System.Linq.Queryable.Take(
.Call System.Linq.Queryable.Skip(
.Call System.Linq.Queryable.OrderBy(
.Constant(NHibernate.Linq.NhQueryable`1[SolutionExample.Domain.Principal]),
"(Lambda#Lambda1),,
0),
25)
.Lambda#Lambda1(SolutionExample.Domain.Principal$o){
.Call($o.PrincipalName).ToLower()
}
经过大量研究,我决定,尽管我可以通过创建自己的自定义方言来实现,或者扩展现有的db2400方言来实现,来解决这个问题-
public SqlString GetLimitString(SqlString queryString, int? offset, int? limit, Parameter offsetParameter, Parameter limitParameter)
这是毫无意义的,因为iSeries允许对
... FETCH FIRST n ROWS ONLY
语法,它没有用于执行偏移的等效语法。。。因此,修复碎片没有多大意义。我只是因为试图设置一个测试台而受到了影响。我花了一段时间才弄明白你在问答中说了什么。在花了几个小时左右的时间逐步完成调试器和其他一切之后,我终于明白了你的意思。不过,这似乎只是使用linq提供程序的一个问题(这对我来说很不幸,因为使用linq是我练习的重点)。
... FETCH FIRST n ROWS ONLY