如何使用NHibernate获取多个深度和宽度的对象?

时间:2011-09-08 19:34:27

标签: c# nhibernate nhibernate-mapping linq-to-nhibernate nhibernate-criteria

我有一个案例需要从数据库加载大约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列表。

收藏品数量如下:

  1. SimulationObject - ca 6000 - 1200,取决于“where”
  2. 中的参数
  3. SimulationObject.Results - 约5到40个项目
  4. SimulationObject.Results.Items - ca 0到2个项目
  5. SimulationObject.PreviewData - ca 0到2个项目
  6. SimulationObject.PreviewData.Items - ca 1 to 3 items
  7. 通常情况下,我会这样做:

    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对象图加载到内存中?

    感谢。

1 个答案:

答案 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可以改进的一个领域。