Castle ActiveRecordを使用して、親子の自己参照を含むレコードをプリロードするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/279392

質問

私のSQLテーブルは次のようになります:

CREATE TABLE Page (
    Id int primary key,
    ParentId int, -- refers to Page.Id
    Title varchar(255),
    Content ntext
)

ActiveRecordモデルの次のクラスにマップします:

[ActiveRecord]
public class Page {

    [PrimaryKey]
    public int Id { get; set; }

    [BelongsTo("Parent")]
    public virtual Page Parent { get; set; }

    [Property]
    public string Title { get; set; }

    [Property]
    public string Content { get; set; }

    [HasMany(typeof(Page), "Parent", "Page")]
    public IList<Page> Children { get; set; }
}

ActiveRecordを使用して、次のコードを使用してツリーのルートを取得しています:

var rootPages = new SimpleQuery<Page>(@"from Page p where p.Parent is null");
return(rootPages.Execute());

これにより正しいオブジェクトグラフが表示されますが、SQLプロファイラートレースでは、ツリー内のすべての非リーフノードに対する個別のクエリによって子ページが読み込まれていることが示されます。

ActiveRecordでロット全体を(&quot; SELECT * FROM Page&quot;)にロードし、メモリ内オブジェクトをソートして必要な親子関係を取得するにはどうすればよいですか?

役に立ちましたか?

解決

これを行う最も簡単な方法は、テーブル全体をフェッチし、結果をフィルタリングすることです。 linqを使用している場合、これは非常に簡単です。

var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);

他のヒント

これを試してください:

var rootPages = new SimpleQuery<Page>(@"from Page p left join fetch p.Children where p.Parent is null");
return(rootPages.Execute());

これにより、最初のクエリ中に結果セットの各ページのChildrenコレクションが作成され、クエリ全体の負荷が1つのクエリに減少します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top