gpt4 book ai didi

nhibernate - NHibernate 中总行数的分页

转载 作者:行者123 更新时间:2023-12-04 21:50:21 26 4
gpt4 key购买 nike

我正在尝试使用 HQL 对一个简单的查询进行分页,并将总行数作为同一查询的一部分进行检索。

我的查询很简单...

var members = UnitOfWork.CurrentSession.CreateQuery(@"
select m
from ListMember as m
join fetch m.Individual as i")
.SetFirstResult(pageIndex*pageSize)
.SetMaxResults(pageSize)
.List<ListMember>();

个人在 ListMember 类上映射为多对一。这很好用。分页按预期工作并生成以下 Sql...
SELECT   TOP ( 10 /* @p0 */ ) DirPeerG1_1_0_,
Director1_0_1_,
Director2_1_0_,
Forename2_0_1_,
Surname0_1_
FROM (SELECT listmember0_.DirPeerGrpMemberID as DirPeerG1_1_0_,
listmember1_.DirectorKeyID as Director1_0_1_,
listmember0_.DirectorKeyId as Director2_1_0_,
listmember1_.Forename1 as Forename2_0_1_,
listmember1_.Surname as Surname0_1_,
ROW_NUMBER()
OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row
FROM tblMembers listmember0_
inner join tblIndividuals listmember1_
on listmember0_.DirectorKeyId = listmember1_.DirectorKeyID) as query
WHERE query.__hibernate_sort_row > 10 /* @p1 */
ORDER BY query.__hibernate_sort_row

我读了 Ayende 发表的这篇文章,名为 Paged data + Count(*) with NHibernate: The really easy way! ,所以我尝试在我的查询中实现它。

我按照文章中的步骤添加了名为 rowcount() 的自定义 HQL 函数,并将我的查询更改为此...
var members = UnitOfWork.CurrentSession.CreateQuery(@"
select m, rowcount()
from ListMember as m
join fetch m.Individual as i")
.SetFirstResult(pageIndex*pageSize)
.SetMaxResults(pageSize)
.List<ListMember>();

生成的 Sql 几乎是正确的,但是它包含两次导致此错误的列之一...

System.Data.SqlClient.SqlException: The column '...' was specified multiple times for 'query'.



它生成的 Sql 看起来像这样......
SELECT   TOP ( 10 /* @p0 */ ) 
col_0_0_,
col_1_0_,
Director1_0_1_,
DirPeerG1_1_0_,
Director1_0_1_,
Director2_1_0_,
Forename2_0_1_,
Surname0_1_
FROM (SELECT
listmember0_.DirPeerGrpMemberID as col_0_0_,
count(*) over() as col_1_0_,
listmember1_.DirectorKeyID as Director1_0_1_,
listmember0_.DirPeerGrpMemberID as DirPeerG1_1_0_,
listmember1_.DirectorKeyID as Director1_0_1_,
listmember0_.DirectorKeyId as Director2_1_0_,
listmember1_.Forename1 as Forename2_0_1_,
listmember1_.Surname as Surname0_1_,
ROW_NUMBER()
OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row
FROM RCMUser.dbo.tblDirPeerGrpMembers listmember0_
inner join RCMAlpha.dbo.tblDirectorProfileDetails listmember1_
on listmember0_.DirectorKeyId = listmember1_.DirectorKeyID) as query
WHERE query.__hibernate_sort_row > 10 /* @p1 */
ORDER BY query.__hibernate_sort_row

出于某种原因,它包括 Director1_0_1_列两次,这会导致此错误。这个 Sql 与我想要的非常接近,我希望那里的 NHibernate 专家可以帮助解释为什么会发生这种情况。

尝试过的建议

感谢@Jason 的建议。我尝试使用 .List() 方法的非通用版本来执行查询,但不幸的是,这也产生了具有重复列的相同 Sql...
var members = UnitOfWork.CurrentSession.CreateQuery(@"
select m, rowcount()
from ListMember as m
join fetch m.Individual as i")
.SetFirstResult(pageIndex * pageSize)
.SetMaxResults(pageSize)
.List()
.Cast<Tuple<ListMember, int>>()
.Select(x => x.First);

更新

如果不进入 NH 源代码,这看起来是不可能的。我的解决方案要求已经改变,我不再追求答案。

总之,解决方案是要么...
  • 使用 Futures 或 MultiQuery 在单个命令中执行两个语句 - 一个用于检索数据页,一个用于总行数。
  • 修改您的分页解决方案以不计算总结果计数 - 例如连续滚动。
  • 最佳答案

    嗯,一个问题是您使用的是 ListMember 类型的 List 方法。在您链接的页面的示例中,他使用 List() 返回元组列表。元组的第一项是 ListMember,第二项是行数。该 List<> 可能会影响您的查询,并且即使它确实返回也可能会引发异常。

    尝试使用:

    var tuples = UnitOfWork.CurrentSession.CreateQuery(@"
    select m, rowcount()
    from ListMember as m
    join fetch m.Individual as i")
    .SetFirstResult(pageIndex*pageSize)
    .SetMaxResults(pageSize)
    .List();

    var members = tuples.Select<Tuple<ListMember, int>, ListMember>(x => x.Item1);

    但我有点同意@dotjoe。 MultiQuery 可能更容易。这是我用的。这是一个很好的 link来自您之前链接的同一作者(Ayende)。

    关于nhibernate - NHibernate 中总行数的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5967815/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com