nHibernate投影-分页和不同

nHibernate投影-分页和不同,nhibernate,pagination,sql-server-2008-r2,distinct,nhibernate-projections,Nhibernate,Pagination,Sql Server 2008 R2,Distinct,Nhibernate Projections,我试图解决的高级问题是在搜索子集合中可能存在的内容时进行重复数据消除分页 我采用的方法是创建一个独特的投影,其中包含与我的DTO相关的信息。我还知道这些值在每行之间不会改变 criteria.SetProjection( Projections.Distinct(Projections.ProjectionList() .Add(Projections.Alias(Projections.Property("Id"), "Id")) .Add(Projections.Alia

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

我采用的方法是创建一个独特的投影,其中包含与我的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;
我想要得到一个清晰的投影的意图被挫败了,因为ROW_NUMBER()使每一行都是唯一的

我遇到了这篇博客文章,它描述了我正在经历的同样的问题

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

编辑


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

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

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

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


要删除这些重复项,我倾向于在执行分页时将集合属性的获取模式设置为“Select”或“Lazy”(通过这种方式,禁用映射的“Eager”或“Join”获取模式)

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

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


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

据此:-

该缺陷在nHibernate 3.3.1.CR1中得到了解决

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

对于那些感兴趣的人,NH3.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;

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

据此:-

该缺陷在nHibernate 3.3.1.CR1中得到了解决

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

对于那些感兴趣的人,NH3.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;

你好您是否为iCiteria找到了此问题的解决方案,或者它仅适用于linq?您好。您是否为ICriteria找到了此问题的解决方案,或者它仅适用于linq?