【问题标题】:NHibernate paging for SQL Server 2012SQL Server 2012 的 NHibernate 分页
【发布时间】:2013-06-10 11:58:03
【问题描述】:

根据这个问题:

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 配置文件中将 &lt;property name="dialect"&gt; 设置为新的 MsSql2012Dialect,现在我的分页查询变得简洁明了。

【问题讨论】:

    标签: nhibernate pagination sql-server-2012


    【解决方案1】:

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

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

    【讨论】:

    • 有一个问题:这个 MsSql2012Dialect 的源代码包含对 NHibernate.SqlCommand.Parser 的引用,最新的 v3.3.3GA 似乎缺少该引用。所以我不确定我是否可以重用这个新的 MsSql2012Dialect。看来,他们在 NH4 中实现了一些重大更改,这使得仅重用部分代码变得困难。
    • 好点。那么它可能归结为从源代码编译 NH。
    • 我花了几个小时检查代码并收集 SqlParser 片段。我必须在我的程序集中导入 3 或 4 个文件才能编译 MsSql2012Dialect。明天我们将进行一些深入的测试,但乍一看,一切似乎都很好。感谢您将我带到 NHibernate 源代码。
    • @Martin 您的自定义 NH 效果如何?您愿意在某处发布源代码/DLL 吗?我面临与您的原始帖子相同的分页问题。谢谢!
    猜你喜欢
    • 2016-05-21
    • 2012-07-03
    • 2014-12-06
    • 1970-01-01
    • 2015-03-04
    • 2020-04-10
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多