0

私の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 にすべてを前もってロードしてから、("SELECT * FROM Page")メモリ内オブジェクトをソートして必要な親子関係を与えるにはどうすればよいですか?

4

2 に答える 2

2

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

var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);
于 2010-07-28T02:35:38.247 に答える
-1

これを試して:

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

これにより、結果セット内の各 Page の Children コレクションが最初のクエリ中に取り出され、クエリ全体の負荷が 1 つのクエリに軽減されます。

于 2008-11-14T18:00:21.483 に答える