My SQL table looks like this:
我的SQL表看起来像这样:
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模型中的以下类:
[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:
我正在使用ActiveRecord使用以下代码检索树根:
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.
这为我提供了正确的对象图,但SQL事件探查器跟踪显示,对于树中的每个非叶节点,子页都由单独的查询加载。
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?
如何让ActiveRecord预先加载整个批次(“SELECT * FROM Page”)然后对内存中的对象进行排序以获得所需的父子关系?
2 个解决方案
#1
2
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.
最简单的方法是获取整个表,然后过滤结果。如果您使用linq,这非常简单。
var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);
#2
-1
Try this:
var rootPages = new SimpleQuery<Page>(@"from Page p left join fetch p.Children where p.Parent is null");
return(rootPages.Execute());
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.
这将导致在初始查询期间填充结果集中每个页面的Children集合,这会将您的整体查询负载减少到单个查询。
#1
2
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.
最简单的方法是获取整个表,然后过滤结果。如果您使用linq,这非常简单。
var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);
#2
-1
Try this:
var rootPages = new SimpleQuery<Page>(@"from Page p left join fetch p.Children where p.Parent is null");
return(rootPages.Execute());
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.
这将导致在初始查询期间填充结果集中每个页面的Children集合,这会将您的整体查询负载减少到单个查询。