【问题标题】:Getting Incorrect syntax near 'OFFSET' error in NHibernate.Linq query在 NHibernate.Linq 查询中出现“OFFSET”错误附近的语法不正确
【发布时间】:2015-09-12 21:10:41
【问题描述】:

我的ASP.NET MVC 4.0 应用程序中出现以下错误,NHibernate v4.0.0 (.Net Framework 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 和其他网站上发现了一些类似的帖子。但是,他们建议使用 SQL SERVER 2012 而不是 2008。 是的,我的 sql 服务器版本是 2008。但是,我使用ASP.NET MVC 5 (.Net Framework 4.5)NHibernate v3.3.1 创建了另一个应用程序,它在相同的数据库和相同的sql server 版本中运行良好。

一些类似的帖子:

  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 server 版本。

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

完整的 NHibernate 查询:

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

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

如果不足,请向我索取更多信息。

谢谢!!

【问题讨论】:

  • 如果您有孙子收藏,请使用fetchmany 而不是fetch
  • Fetch 应该用于引用,fetchmany 应该用于集合
  • 是的,但是正如我在问题中提到的,相同的代码和相同的工作在不同的 NHibernate 版本中运行良好

标签: c# sql-server asp.net-mvc nhibernate nhibernate-configuration


【解决方案1】:

看来,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

【讨论】:

  • 感谢@Radim,您刚刚解决了我的问题。你是对的,我错误地为 NHibernate 配置了 sql server 版本。
  • 很高兴看到 NHibernate 为您工作。祝你好运,这是一个了不起的工具;)
  • EF 有同样的问题。检查 edmx 文件中的 ProviderManifestToken 标签。
  • 哦,是的,“更新模型”也会自动更新“ProviderManifestToken”!因此,如果您在开发环境中使用的 sql server 版本与实际版本不同,请密切关注此文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2013-12-15
  • 2013-03-11
  • 2017-07-04
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多