我有一个案例,我需要从数据库中加载大约 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 列表,以及它的所有属性(引用)和子项。
收藏数量如下:
- SimulationObject - ca 6000 - 1200,取决于“where”中的参数
- SimulationObject.Results - 大约 5 到 40 个项目
- SimulationObject.Results.Items - 大约 0 到 2 个项目
- SimulationObject.PreviewData - 大约 0 到 2 个项目
- 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 个查询......而且还有其他困难,所以这甚至不是考虑的替代方案)。
那么有哪些选择呢?您将使用什么策略将复杂对象图加载到内存中?
谢谢。