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;

ROW_NUMBER()によってすべての行が一意になるため、DISTINCTプロジェクションを取得するという私の意図は妨げられています。

私が経験しているのと同じ問題を説明しているこのブログ投稿に出くわしました。

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

そこで提供されたソリューションには、nHibernateMSSQLコードの変更が含まれていました。これはオプションですが、避けたいと思っています。この問題を回避するオプションがnHibernateのより最近のバージョンにありますか?

編集

nHibernate3.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 安定版をダウンロードしたばかりで、重複することなく同じ戦略をうまく使用できました。

興味のある方のために、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 に答える