4

データを熱心にロードしたい Orchard CMS モジュールを構築していますが、これを行う方法がわかりません。

たとえば、クライアントには多くのイベントがあるため、これらの ClientRecord と EventRecord があります。

public class ClientRecord {

    private IList<EventRecord> _eventRecords;

    public virtual int Id { get; set; }

    public virtual string Company { get; set; }

    public virtual IList<EventRecord> EventRecords {
        get { return _eventRecords ?? (_eventRecords = new List<EventRecord>()); }
        set { _eventRecords = value; }
    } 
}

ClientController にクライアントをロードするとき

var clientRecord = _clientRepository.Get(id);

次に、ビューにイベントを表示します

    <ul>
        @foreach (var eventRecord in Model.EventRecords) {
            <li>
                @eventRecord.Name (@eventRecord.StartDate.ToShortDateString())
            </li>
        }
    </ul>

イベントが表示され、MiniProfiler はイベントを遅延ロードする別のクエリを表示します。

ClientRecord の EventRecords コレクションに [Aggregate] 属性を設定しようとしましたが、効果がありませんでした。

私は NHibernate にあまり詳しくないので、これは簡単なことだと思いますが、ClientRecord が取得されたときに EventRecord を熱心にロードするように指定するにはどうすればよいでしょうか?

[編集]

Orchard CMS では、クラスが xxxRecord と呼ばれ、同じ名前のデータベース テーブルが配置されているという規則に基づいて、NHibernate マッピングが作成されます。

したがって、(私の知る限り)これを指定できるマッピングファイルはありません。私がそれについて正しい場合、問題は、クエリで熱心な読み込みを希望することを指定する方法があるかどうかです。 Client を取得するために使用します (Entity Framework の「include」メソッドのように)。

4

1 に答える 1

1

nHibernate マッピング ファイルで熱心な読み込みを指定する必要があります。Fluent nhibernate を使用すると、次のようになります。

HasMany(x => x.EventRecords).KeyColumn("CompanyId").Not.LazyLoad().Fetch.Select();

Fetch.Select()、2 番目の select ステートメントを実行して、関連するすべてのイベント レコードをロードします。

このNot.LazyLoad()2 番目の選択をすぐに実行するように nHibernate に指示します。この実行を削除すると、コレクションがアクセスされるまで延期されます。

コメントに応じて、フェッチを使用してクエリで熱心な読み込みを指定することもできます (LINQ の例を示します)。

NHSession.Query<ClientRecord>().Fetch(c => c.EventRecords).ToList();
于 2013-06-26T13:12:15.053 に答える