San*_*zen 8 sql-server nhibernate paging criteria projection
我正在写一个NHibernate标准,选择支持分页的数据.我正在使用COUNT(*) OVER()SQL Server 2005(+)中的表达式来获取可用行的总数,正如Ayende Rahien 所建议的那样.我需要这个数字才能计算出总共有多少页面.这个解决方案的优点在于我不需要执行第二个查询来获取行计数.
但是,我似乎无法设法编写工作标准(Ayende只提供HQL查询).
这是一个SQL查询,显示我想要的东西,它工作得很好.请注意,我故意省略了实际的分页逻辑以关注问题:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
Run Code Online (Sandbox Code Playgroud)
这是HQL:
select
item, rowcount()
from
Item item
Run Code Online (Sandbox Code Playgroud)
请注意,该rowcount()函数在自定义NHibernate方言中注册,并COUNT(*) OVER()在SQL中解析.
要求是使用条件表达查询.不幸的是,我不知道如何做到正确:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Run Code Online (Sandbox Code Playgroud)
每当我添加投影时,NHibernate都不会选择item(就像没有投影一样),就rowcount()在我真正需要的时候.此外,我似乎无法item整体投影,只有它的属性,我真的不想列出所有这些.
我希望有人能解决这个问题.不管怎么说,还是要谢谢你.
我认为在Criteria中不可能,它有一些限制.
您可以在后续查询中获取id并加载项:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(Projections.ProjectionList()
.Add(Projections.SqlFunction("rowcount", NHibernateUtil.Int32))
.Add(Projections.Id()));
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢它,使用HQL,您也可以设置最大结果数:
IList<Item> result = Session
.CreateQuery("select item, rowcount() from item where ..." )
.SetMaxResult(100)
.List<Item>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3333 次 |
| 最近记录: |