崩溃中!Nhibernate的数据分页.

这两天在做项目一个模块中关于基于Asp.net MVC ,底层的数据访问用的是Nhibernate OR Mapping技术, 其中涉及到数据分页. 确实令人苦恼!

Nhibernate中我刚开始的思路是做一个十万中量级别的数据分页,起初打算在Nhibernate中用T-SQl来做,而且在Asp.MVC框架中只能使用客户端控件,而非Nhibernate中HQL查询语法,但是在写好T-SQl语句后发现一个Nhibernate虽然对Avg count(*)等加以支持,但Top关键字确无法支持,中途也利用平畴SQL的放法,一个下午后无果而返.

下午下班后我有尝试一种在Nhibernate中使用存储过程的方式来进行数据分页,即把原来的T-sql十万当量的数据分页封装一下,但是8:30自后,发现两点对存储过程的现在,一方面配置上问题都是第一次接触,而且Nhibernate2.0版本对存储过程要求配置很严格,另外必须返回一个数据集,功能就都没法实现,更不要说数据分页的性能了,这种方式抛弃.

在网上Google一下发现园子里也有不少关于Nhibernate的数据分页,就抓紧时间看了一下,其中一篇文章倒是打破了我以往的思路,

就是把利用Nhibernate中HQL语法查询出所需数据,nhibernate 提供了一个接口IQuery用来设置查询语句、参数等,此接口的实现类为QueryImpl,跟CriteriaImpl一样,不能在 nhibernate程序集外直接创建,只能通过session的CreateQuery来取得一个IQuery接口,

Code
IQuery接口的一些方法:
  SetMaxResults:设置返回的最大结果数,可用于分页;
  SetFirstResult:设置首个对象返回的位置,可用于分页;
  SetTimeout:设置操作的超时值,此值将传递给IDbCommand对象;
  Enumerable:返回查询的枚举对象;
  List:返回查询的对象集合;
  SetParameter:设置查询语句中参数的值和类型

从上面可以发现两个非常重要的方法SetFirstResult(int startindex)和SetMaxResults(int size)

这两个方法组合其实就代替了SQl中Top 关键字,当取出数据后装入Ilist<>中,通过SetFirstResult设置开始取位置,而SetMaxResults就是设定一次取出的数据量是多少,这样就很明了! 当然只是一种粗略的思路,具体细节在验证后我会发一片文章上来,

也许这种方式并不合理,还希望有这方面经验的仁兄能指点一二,不胜感激!

原文地址:https://www.cnblogs.com/chenkai/p/1467475.html