在 NHibernate.Linq 查询中 'OFFSET' 附近出现语法错误

Getting Incorrect syntax near 'OFFSET' error in NHibernate.Linq query

我在使用 NHibernate v4.0.0 (.Net Framework 4.0)ASP.NET MVC 4.0 应用程序中遇到以下错误。此错误显示在 NHibernate.Linq 查询

Incorrect syntax near 'OFFSET'.
Invalid usage of the option FIRST in the FETCH statement.

在这一行

Line 23:         public IList<Post> Posts(int pageNo, int pageSize)
Line 24:         {
Line 25:             var posts = _session.Query<Post>()  //here
Line 26:                                   .Where(p => p.Published) 
Line 27:                                   .Skip(pageNo * pageSize)

我在 SO 和其他网站上发现了一些类似的 post。但是,他们建议使用 SQL SERVER 2012 而不是 2008。 是的,我的 sql 服务器版本是 2008。但是,我使用 ASP.NET MVC 5 (.Net Framework 4.5)NHibernate v3.3.1 创建了另一个应用程序,它在相同的数据库和相同的 sql 服务器版本中运行良好。

有些相似post:

  1. “Incorrect syntax near 'OFFSET'” modift sql comm 2012 to 2008
  2. Pagination query for mssql server 2008 Throwing Incorrect syntax near 'OFFSET'
  3. Making sense of 'OFFSET/FETCH' in SSMS 2012

所以,我认为问题不在我的 sql 服务器版本中,至少在我的情况下如此。

我没有直接向 ssms 或通过命令对象执行 sql 查询。我正在使用 NHibernate.Linq 查询。

完整的 NHibernate 查询:

 var posts = _session.Query<Post>()
                              .Where(p => p.Published)
                              .Skip(pageNo * pageSize)
                              .Take(pageSize)
                              .Fetch(p => p.Category)
                              .ToList();

我该如何解决这个问题。请指导我。

不足之处请追问

谢谢!!

看来,NHibernate 只是被错误地指示使用与 SQL Serer 2012

相关的方言
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>

设置为2008就可以了

<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>

并且它不会使用更高版本的功能Implement paging (skip / take) functionality with this query