SQL Server 2012的NHibernate分页

时间:2013-06-10 11:58:03

标签: nhibernate pagination sql-server-2012

根据这个问题:

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提供程序使用MsSql2012Dialect的分页功能并使用OFFSETFETCH生成查询?

解决方案:

感谢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/src/NHibernate/SqlCommand/Parser/SqlToken.cs

据我记忆,我做了一些修改以删除不必要的代码。 在SqlTokenizerExtensions中,我只留下了这两个扩展名:

public static bool TryParseUntil(this IEnumerator<SqlToken> tokenEnum, string keyword)
public static bool TryParseUntilFirstMsSqlSelectColumn(this IEnumerator<SqlToken> tokenEnum)

SqlTokenizer,SqlToken,SqlParserUtils,MsSql2012Dialect - 无变化。

然后我在我的NHibernate配置文件中将<property name="dialect">设置为新的MsSql2012Dialect,现在我的分页查询简洁明了。

1 个答案:

答案 0 :(得分:3)

如果你看看NH-3038,你会发现它已经在master / vNext中修复了。这意味着NH4。

您仍然可以从https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/MsSql2012Dialect.cs获取更新后的方言,将其包含在项目中并引用它(添加正确的程序集名称)。