我试图解决的高级问题是在搜索子集合中可能存在的内容时重复分页。
我采用的方法是创建一个独特的投影,其中包含与我的 DTO 相关的信息。我也知道这些值在每一行之间不会改变。
criteria.SetProjection(
Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("Id"), "Id"))
.Add(Projections.Alias(Projections.Property("Title"), "Title"))
.Add(Projections.Alias(Projections.Property("Firstname"), "Firstname"))
.Add(Projections.Alias(Projections.Property("Surname"), "Surname"))
.Add(Projections.Alias(Projections.Property("DateCreated"), "DateCreated"))));
当我引入分页/排序元素时会出现问题。
查看 NH Profiler,我看到的 SQL 如下:-
SELECT TOP (20 /* @p0 */) y0_,
y1_,
y2_,
y3_,
y4_
FROM
(
SELECT distinct
this_.Id as y0_,
this_.Title as y1_,
this_.Firstname as y2_,
this_.Surname as y3_,
this_.DateCreated as y4_,
ROW_NUMBER()
OVER(ORDER BY this_.Firstname DESC, this_.Surname DESC)
as __hibernate_sort_row
FROM Users this_
) as query
WHERE query.__hibernate_sort_row > 20 /* @p1 */
ORDER BY query.__hibernate_sort_row;
我想要获得 DISTINCT 投影的意图被阻挠,因为 ROW_NUMBER() 使每一行都独一无二。
我遇到了这篇博文,它描述了我遇到的同样的问题。
那里提供的解决方案涉及更改 nHibernate MS SQL 代码;这是一种选择,但我很想避免。nHibernate 的最新版本中是否有解决此问题的选项?
编辑
在 nHibernate 3.3.1 中修复 - 请参阅下面的答案。