根据这个问题:
https://nhibernate.jira.com/browse/NH-3038
NHibernate 应该为 SQL Server 2012 创建高效的分页查询。
我有 NHibernate 3.3.3GA。我在配置文件中设置了方言:
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
在调试时我看到会话工厂确实有MsSql2012Dialect
.
但仍然是以下代码:
session.Query<TestEntity>().Skip(1).Take(1).ToList()
生成与旧 SQL Server 2008 方言相同的 T-SQL:
exec sp_executesql N'
SELECT TOP (@p0) EntityId1_, Version1_, Name1_, Something1_
FROM (select testentity0_.EntityId as EntityId1_, testentity0_.Version as Version1_, testentity0_.Name as Name1_, testentity0_.Something as Something1_, ROW_NUMBER()
OVER(ORDER BY CURRENT_TIMESTAMP)
as __hibernate_sort_row from tTestEntity testentity0_) as query
WHERE query.__hibernate_sort_row > @p1
ORDER BY query.__hibernate_sort_row',N'@p0 int,@p1 int',@p0=1,@p1=1
如何使 NHibernate Linq 提供程序使用分页功能并使用andMsSql2012Dialect
生成查询?OFFSET
FETCH
解决方案:
感谢 Diego Mijelshon 引导我找到正确的源代码,我设法实现了一个似乎工作正常的快速修复。我们已经使用它几个月了,还没有问题。
这是我所做的:
我将 NHibernate 源代码中的以下类导入到我自己的库中:
https://github.com/nhibernate/nhibernate-core/blob/967091f5c22a16a576f46144055f78c0f373ffcd/src/NHibernate/SqlCommand/Parser/SqlTokenizerExtensions.cs https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate /Dialect/MsSql2012Dialect.cs https://github.com/nhibernate/nhibernate-core/blob/967091f5c22a16a576f46144055f78c0f373ffcd/src/NHibernate/SqlCommand/Parser/SqlTokenizer.cs https://github.com/nhibernate/nhibernate-core/blob /967091f5c22a16a576f46144055f78c0f373ffcd/src/NHibernate/SqlCommand/Parser/SqlParserUtils.cs https://github.com/nhibernate/nhibernate-core/blob/967091f5c22a16a576f46144055f78c0f373ffcd/srcToken/SqlTokencs/SQLibernate/Command
据我记得,我做了一些修改以删除不必要的代码。在 SqlTokenizerExtensions 我只留下了这两个扩展:
public static bool TryParseUntil(this IEnumerator<SqlToken> tokenEnum, string keyword)
public static bool TryParseUntilFirstMsSqlSelectColumn(this IEnumerator<SqlToken> tokenEnum)
SqlTokenizer、SqlToken、SqlParserUtils、MsSql2012Dialect - 没有变化。
然后我只是<property name="dialect">
在我的 NHibernate 配置文件中设置了新的 MsSql2012Dialect,现在我的分页查询变得简洁明了。