如何使用Castle ActiveRecord预加载包含父子自引用的记录?

时间:2008-11-10 22:24:53

标签: nhibernate tree castle-activerecord

我的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")然后对内存中的对象进行排序以获得所需的父子关系?

2 个答案:

答案 0 :(得分:2)

最简单的方法是获取整个表,然后过滤结果。如果您使用linq,这非常简单。

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

答案 1 :(得分:-1)

试试这个:

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

这将导致在初始查询期间填充结果集中每个页面的Children集合,这会将您的整体查询负载减少到单个查询。