sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择

标签 sql-server nhibernate paging criteria projection

我正在编写一个 NHibernate 标准来选择支持分页的数据。我正在使用 COUNT(*) OVER() SQL Server 2005(+) 中的表达式来获取可用行的总数,如 suggested由 Ayende Rahien。我需要这个数字才能计算出总共有多少页。这个解决方案的美妙之处在于我不需要执行第二个查询来获取行数。

但是,我似乎无法编写工作标准(Ayende 仅提供 HQL 查询)。

这是一个 SQL 查询,它显示了我想要的内容,并且运行良好。请注意,我故意省略了实际的分页逻辑以关注问题:

SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items

这是 HQL:
select
    item, rowcount()
from 
    Item item

请注意 rowcount()函数在自定义 NHibernate 方言中注册并解析为 COUNT(*) OVER()在 SQL 中。

一个要求是使用标准来表达查询。不幸的是,我不知道如何正确处理:
var query = Session
    .CreateCriteria<Item>("item")
    .SetProjection(
       Projections.SqlFunction("rowcount", NHibernateUtil.Int32));

每当我添加投影时,NHibernate 不会选择 item (就像没有投影一样),只是 rowcount()虽然我真的需要两者。另外,我似乎无法转换 item总的来说,只有它的属性,我真的不想列出所有这些。

我希望有人能解决这个问题。不管怎么说,还是要谢谢你。

最佳答案

我认为在 Criteria 中这是不可能的,它有一些限制。

您可以在后续查询中获取 id 并加载项目:

var query = Session
    .CreateCriteria<Item>("item")
    .SetProjection(Projections.ProjectionList()
       .Add(Projections.SqlFunction("rowcount", NHibernateUtil.Int32))
       .Add(Projections.Id()));

如果你不喜欢它,使用 HQL,你也可以在那里设置最大结果数:
IList<Item> result = Session
    .CreateQuery("select item, rowcount() from item where ..." )
    .SetMaxResult(100)
    .List<Item>();

关于sql-server - 向 NHibernate 标准添加投影会阻止它执行默认实体选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1644776/

相关文章:

sql-server - 为什么 redshift 不接受我的固定宽度文本文件

c# - 从集合中删除在 Nhibernate 中不起作用

javascript - ngx-datatable 可配置分页参数

linux - 在 MIPS TLB 中,除了 ASID 字段之外,两个条目是否可能相同?

android - 使用远程调解器和分页源对具有分页 3 的存储库进行单元测试

c# - 从 C# 运行 Sql Server 代理作业

sql - 获取在 UPDATE 触发器上运行 SQL 查询的作业

sql - OHCL(开-高-低-闭)T-SQL 查询

sql - 在一组数字中查找连续范围

nhibernate - JoinQueryOver 和 JoinAlias 有什么区别?