私が解決しようとしている高レベルの問題は、子コレクションに存在する可能性のあるものを検索するときの重複解除されたページングです。
私が採用しているアプローチは、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プロジェクションを取得するという私の意図は妨げられています。
私が経験しているのと同じ問題を説明しているこのブログ投稿に出くわしました。
そこで提供されたソリューションには、nHibernateMSSQLコードの変更が含まれていました。これはオプションですが、避けたいと思っています。この問題を回避するオプションがnHibernateのより最近のバージョンにありますか?
編集
nHibernate3.3.1で修正されました-以下の回答を参照してください。