1

我试图解决的高级问题是在搜索子集合中可能存在的内容时重复分页。

我采用的方法是创建一个独特的投影,其中包含与我的 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() 使每一行都独一无二。

我遇到了这篇博文,它描述了我遇到的同样的问题。

http://www.daczkowski.net/2010/09/07/rows-duplication-for-certain-nhibernate-queries-%E2%80%93-workaround/

那里提供的解决方案涉及更改 nHibernate MS SQL 代码;这是一种选择,但我很想避免。nHibernate 的最新版本中是否有解决此问题的选项?

编辑

在 nHibernate 3.3.1 中修复 - 请参阅下面的答案。

4

2 回答 2

1

为了删除这些重复项,我倾向于在进行分页时将集合属性的获取模式设置为“选择”或“惰性”(这样,禁用映射的“急切”或“加入”获取模式)

假设您有一个属性 Children,这将导致删除投影并添加:

criteria.SetFetchMode("Children", FetchMode.Select);

criteria.SetResultTransformer(NHibernate.Transform.Transformers.DistinctRootEntity).List();
于 2012-12-05T10:47:14.840 回答
0

经过一些进一步的研究,我现在找到了一个我很满意的解决方案。

根据这个:-

https://nhibernate.jira.com/browse/NH-2492

该错误已在 nHibernate 3.3.1.CR1 中得到解决。

我刚刚下载了 nHibernate 3.3.1 stable,并且成功地使用了相同的策略,没有重复。

对于那些感兴趣的人,nh 3.3.1 吐出以下 SQL。

SELECT distinct TOP (20 /* @p0 */) this_.Id as y0_,
  this_.Title as y1_,
  this_.Firstname       as y2_,
  this_.Surname     as y3_,
  this_.DateCreated  as y4_,
 FROM   Users this_
ORDER  BY this_.Firstname desc,
          this_.Surname desc;
于 2012-12-05T11:47:25.487 回答