我有一个案例需要从数据库加载大约10 000个对象。数据模型是这样的:
public class SimulationObject
{
public Container Container {get;set;}
public IList<ResultItem> Results {get;set;}
public IList<PreviewData> PreviewData {get;set;}
...
}
public class ResultItem
{
public IList<SomeDataItem> Items {get;set;}
...
}
public class PreviewData
{
public IList<SomeDataItem> Items {get;set;}
...
}
这意味着我想根据某些查询及其所有属性(引用)和子项查询数据库中的SimulationObjects列表。
收藏品数量如下:
通常情况下,我会这样做:
var query = from sim in session.Query<SimulationObject>()
where sim.Container.Id == containerId && ...
select sim;
query = query.FetchMany(c => c.Results).ThenFetch(o => o.Items)...
但是,我还需要获取“PreviewData”项目,这将在我的查询中创建一个笛卡尔积(意味着PreviewDataAndSubItemsCount x ResultsAndSubItemsCount返回的行数),这是非常无效的。另外,由于我需要加载很多SumulationObjects(大约10000,如前所述),我不能进行延迟加载(10000个查询......还有其他困难,所以这甚至不是另一种考虑因素)。
那么有哪些替代方案呢?您将使用什么策略将complite对象图加载到内存中?
感谢。
答案 0 :(得分:2)
Ayende在这里解释了一种方法( HQL ):
http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate
我还遇到了一篇StackOverflow文章,使用 QueryOver 执行此操作:
NHibernate Eager Loading with Queryover API on a complex object graph
我会非常有兴趣从其他的社区获得额外的输入。我认为这是NH可以改进的一个领域。