0

リレーショナル データベースに保存されているいくつかのオブジェクトを表示する必要があり、流暢な NHibernate を使用してそれらを取得します。

ページングが必要なので、すべてのオブジェクトの数と、現在のページ自体のオブジェクトの両方を取得する必要があります。

両方の目的の ICriteria は、ある程度までは非常に似ています。カウントについては、最後に .SetProjection(Projections.RowCount()) を追加し、現在のオブジェクト リストについては、 SetFirstResult、AddOrder、およびSetMaxResultsを追加します。

基準の投影を元に戻し、結果自体の基準を再利用する方法はありますか、それともその目的のために基準を再構築する必要がありますか?

hibernate フォーラムは、うまくいかない方法を提案しています。

4

2 に答える 2

2
public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
var criteria = GetCriteria()
var count = criteria 
    .Clone()
    .GetExecutableCriteria(session)
    .SetProjection(Projections.Count(Projections.Id()))
    .UniqueResult<int>();

var result = criteria 
    .GetExecutableCriteria(session)
    .SetFirstResult(0) 
    .SetMaxResults(10)
    .List<Entity>();
于 2010-07-17T10:37:52.583 に答える
2

制限、グループ化などを含むクエリ ロジックをカプセル化するメソッドを作成します。

public DetachedCriteria GetCriteria()
{
    return DetachedCriteria.For<Entity>()
        .Add(Restrictions.Eq(...))
        .Add(...);
}

次に、リクエストをデータベースに送信します。

var count = GetCriteria()
    .GetExecutableCriteria(session)
    .SetProjection(Projections.Count(Projections.Id()))
    .UniqueResult<int>();

var result = GetCriteria()
    .GetExecutableCriteria(session)
    .SetFirstResult(0) 
    .SetMaxResults(10)
    .List<Entity>();

これをさらに最適化するには、Ayende Rahien が NHibernate Futures について語っているこの優れたブログ記事をご覧ください。

于 2009-12-09T18:41:01.483 に答える