私は Criteria を使用してクエリを高速化しています。
例によるクエリを使用してテーブル内の行を照合し、同じ ID を持つ重複する行を削除してから、ページ分割します。
もちろん、重複した行を削除するまでページネーションを行うことはできません。その方法もわかりません。これは SQL で実行できますが、それは流暢なコードに適合します。ISQLQuery は ICriteria オブジェクトを返しません。
public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
{
var startRow = startingPage * pageSize;
// Query By Example.
var example = Example.Create(exampleEntitySearch)
.IgnoreCase()
.EnableLike(MatchMode.Anywhere)
.ExcludeZeroes();
var results = this.Session.CreateCriteria(typeof(EntitySearch))
.Add(example)
// select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
.SetFirstResult(startRow)
.SetMaxResults(pageSize)
.List<DealSearch>();
return results;
}
私が読んだアドバイスは、SQLクエリをNHibernateで書くことですが、気の利いた「ROW_NUMBER() over partition SQL」を変換する方法がわかりません。最初にエンドツーエンドで動作させてから、よりエレガントにしたいと思います。
このスパイクを本番環境に導入して、最大 90% の速度向上を証明したいと考えています。