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

前端之家收集整理的这篇文章主要介绍了sql-server – 将投影添加到NHibernate标准会阻止它执行默认实体选择前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在写一个NHibernate标准,选择支持分页的数据.我正在使用sql Server 2005()中的COUNT(*)OVER()表达式来获取可用行的总数,如Ayende Rahien的 suggested.我需要这个数字才能计算出总共有多少页.这个解决方案的优点是我不需要执行第二个查询获取行数.

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

这是一个SQL查询,显示我想要的东西,它工作得很好.请注意,我故意省略了实际的分页逻辑以关注问题:

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

这是HQL:

  1. select
  2. item,rowcount()
  3. from
  4. Item item

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

要求是使用条件表达查询.不幸的是,我不知道如何做对:

  1. var query = Session
  2. .CreateCriteria<Item>("item")
  3. .SetProjection(
  4. Projections.sqlFunction("rowcount",NHibernateUtil.Int32));

每当我添加投影时,NHibernate都不会选择项目(就像没有投影一样),只需要rowcount(),而我真的需要两者.此外,我似乎无法将项目作为一个整体,只有它的属性,我真的不想列出所有这些.

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

解决方法

我认为在Criteria中不可能,它有一些限制.

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

  1. var query = Session
  2. .CreateCriteria<Item>("item")
  3. .SetProjection(Projections.ProjectionList()
  4. .Add(Projections.sqlFunction("rowcount",NHibernateUtil.Int32))
  5. .Add(Projections.Id()));

如果您不喜欢它,使用HQL,您也可以设置最大结果数:

  1. IList<Item> result = Session
  2. .CreateQuery("select item,rowcount() from item where ..." )
  3. .SetMaxResult(100)
  4. .List<Item>();

猜你在找的MsSQL相关文章