nHibernate SetFirstResult& SetMaxResults问题

时间:2009-03-17 02:00:46

标签: c# sql-server nhibernate

我正在使用nHibernate并尝试实现一些分页。如果我运行此代码

IList list = session.CreateQuery("FROM Author").List();

它返回8条记录。如果我运行此代码

IList list = session.CreateQuery("FROM Author")
    .SetFirstResult(1).SetMaxResults(5).List();

它返回0条记录。当我看到生成的SQL时,我看不到有任何分页逻辑。

最可能的错误是什么?

3 个答案:

答案 0 :(得分:3)

我不确定NHibernate,但在Java中,结果索引是基于0的。尝试调用.SetFirstResult(0)而不是.SetFirstResult(1),否则如果只有一行,则返回0结果。听起来你有8行,所以我不知道为什么你不会在任何情况下得到一些结果。

答案 1 :(得分:1)

你的语法是正确的,所以只要该表中有数据,我就不确定它为什么会返回0结果。

就生成的SQL而言,MSSQL Server不支持LIMIT和OFFSET命令,因此无法在服务器上以这种方式实现分页。 (n.b.我的理解是SQL Server 2005改进了分页方法,但仍然不支持LIMIT或OFFSET)因此,对于SQL 2000,必须检索所有行,然后从该结果集中选择子集。

我可以建议的另一件事是检查您的查询是否在单独的事务中。我看过帖子表明这可能会有所帮助。可能有一些东西,因为我使用SetFirstResult / SetMaxResults的单元测试是成功的。

答案 2 :(得分:0)

也许在web.config或app.config

中检查您的Dialect和Connection Provider
  <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
  <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
  <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>