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 Profiler 跟踪显示,子页面正在由树中每个非叶节点的单独查询加载。

如何让 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());

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

于 2008-11-14T18:00:21.483 回答