2

我有一个案例,我需要从数据库中加载大约 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. SimulationObject.Results - 大约 5 到 40 个项目
  3. SimulationObject.Results.Items - 大约 0 到 2 个项目
  4. SimulationObject.PreviewData - 大约 0 到 2 个项目
  5. SimulationObject.PreviewData.Items - 大约 1 到 3 个项目

通常,我会这样做:

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 个查询......而且还有其他困难,所以这甚至不是考虑的替代方案)。

那么有哪些选择呢?您将使用什么策略将复杂对象图加载到内存中?

谢谢。

4

1 回答 1

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

不过,我很想从 hte 社区的其他人那里获得额外的意见。我认为这是NH可以改进的一个领域。

于 2011-09-08T20:23:57.403 回答