如何使用 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 Profiler 跟踪显示子页面由树中每个非叶节点的单独查询加载。
如何让 ActiveRecord 预先加载全部内容 ("SELECT * FROM Page")
然后对内存中的对象进行排序以获得所需的父子关系?
My SQL table looks like this:
CREATE TABLE Page (
Id int primary key,
ParentId int, -- refers to Page.Id
Title varchar(255),
Content ntext
)
and maps to the following class in my ActiveRecord model:
[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; }
}
I'm using ActiveRecord to retrieve the tree roots using the following code:
var rootPages = new SimpleQuery<Page>(@"from Page p where p.Parent is null");
return(rootPages.Execute());
This gives me the correct object graph, but a SQL Profiler trace shows that child pages are being loaded by a separate query for every non-leaf node in the tree.
How can I get ActiveRecord to load the whole lot up front ("SELECT * FROM Page")
and then sort the in-memory objects to give me the required parent-child relationships?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最简单的方法是获取整个表,然后过滤结果。 如果您使用 linq,这非常简单。
The easiest way to do this is to fetch the entire table, then filter the result. This is pretty easy, if you are using linq.
试试这个:
这将导致结果集中每个 Page 的 Children 集合在初始查询期间被填充,这应该将整体查询负载减少到单个查询。
Try this:
This will cause the Children collection of each Page in the result set to be populated out during the initial query, which should reduce your overall query load to a single query.