4

私はいくつかのオブジェクトを持っています:

Public Class Person() {
    public int Id {get;set;}
    public IList<Account> Accounts {get;set;}
    public string Email {get; set;}
}

public class Account(){
    public int Id {get;set;}
    public IList<AccountPayment> Payments {get;set;}
    public IList<Venue> Venues {get;set;}
}

public class AccountPayment(){
    public int Id {get;set;}
    public DateTime PaymentDate {get;set;}
    public decimal PaymentAmount {get;set;}
}

public class Venue(){
    public int Id {get;set;}
    public string AddressLine1 {get;set;}
    public string Postcode {get;set;}
}

これらのクラスは nHibernate を使用して MS Sql にマップされます - クラスごとに db にテーブルがあります...

アカウントのすべての子コレクションが最も効率的な方法で取り込まれた List を返すメソッド GetAccounts(int PersonID) をリポジトリに作成したいと考えています。誰かがこれを行う方法についての指針を教えてもらえますか-リストをマッピングでサブセレクトとして設定したくありません...

ありがとう。

4

2 に答える 2

1

言及した方法でクラスをテーブルにマップした場合は、Personオブジェクトを呼び出してすべてのアカウントを取得してみませんか?リポジトリからPersonオブジェクトを呼び出すと、アカウントを熱心にロードできます。そのようです:

 public Person GetById(int id)
    {
        using (var tx = _sessionBuilder.GetSession().BeginTransaction())
        {
            // -- Lazy load way --
            //Person person = _sessionBuilder.GetSession().Get<Person>(id);
            //tx.Commit();
            //return person;

            // -- Eager load way --                
            Person person = _sessionBuilder.GetSession().CreateCriteria<Person>()
                   .Add(Restrictions.IdEq(id))
                   .SetFetchMode("Accounts", FetchMode.Eager)
                   .UniqueResult<Person>();
            tx.Commit();
            return person;
        }
    }
于 2010-05-12T14:24:48.007 に答える
0

わかりました、さまざまな方法でこれを実行しようとした後、最終的に、この質問で概説されている最も効率的な解決策を見つけました。

NHibernate を使用した子コレクションの熱心な読み込み

上記の私の質問は、私が抱えていた実際の課題の大幅に単純化されたバージョンでしたが、上記の方法を使用すると、データベースのヒット数を 2 に減らすことができました...私の最初の実装から大幅に改善されました。

助けてくれてありがとう。途中で少し勉強...

于 2010-05-13T09:53:28.137 に答える