5

私は 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% の速度向上を証明したいと考えています。

4

1 に答える 1

0

パフォーマンスについてはわかりませんが、LINQ を使用できます。

変化する:

.List<DealSearch>();

に:

.List<DealSearch>().Distinct().ToList();
于 2012-01-05T15:00:32.393 に答える