gpt4 book ai didi

c# - 如何使用 NHibernate 获取多层次的对象?

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:22 25 4
gpt4 key购买 nike

我有一个案例需要从数据库中加载大约 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 个查询......还有其他困难,所以这甚至不是一个可供考虑的替代方案)。

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

谢谢。

最佳答案

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

关于c# - 如何使用 NHibernate 获取多层次的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com