C# 如何使用NHibernate获取多个深度和广度的对象?
我有一个例子,我需要从数据库中加载大约10000个对象。数据模型如下所示:C# 如何使用NHibernate获取多个深度和广度的对象?,c#,nhibernate,nhibernate-mapping,linq-to-nhibernate,nhibernate-criteria,C#,Nhibernate,Nhibernate Mapping,Linq To Nhibernate,Nhibernate Criteria,我有一个例子,我需要从数据库中加载大约10000个对象。数据模型如下所示: public class SimulationObject { public Container Container {get;set;} public IList<ResultItem> Results {get;set;} public IList<PreviewData> PreviewData {get;set;} ... } public class R
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;}
...
}
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)...
公共类模拟对象
{
公共容器容器{get;set;}
公共IList结果{get;set;}
公共IList预览数据{get;set;}
...
}
公共类结果
{
公共IList项{get;set;}
...
}
公共类预览数据
{
公共IList项{get;set;}
...
}
这意味着我想根据某个查询从数据库中查询SimulationObject列表,以及它的所有属性(引用)和子项
收集的数量如下所示:
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;}
...
}
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)...
var query=来自会话中的sim卡。query()
其中sim.Container.Id==containerId&&。。。
选择sim卡;
query=query.FetchMany(c=>c.Results)。然后fetch(o=>o.Items)。。。
但是,我还需要获取“PreviewData”项,因为这将在我的查询中创建笛卡尔积(意味着PreviewData和SubItemsCount x ResultsAndSubItemsCount返回的行数),这是非常无效的。另外,由于我需要加载很多SumulationObject(如前所述,大约10000个),所以我不能进行延迟加载(10000个查询..还有其他困难,所以这甚至不是考虑的替代方案)
那么,还有什么选择呢?您将使用什么策略将complite对象图加载到内存中
谢谢。Ayende在这里解释了一种方法(HQL):
我还看到一篇StackOverflow文章,它使用QueryOver:
不过,我非常有兴趣从hte社区的其他成员那里获得更多的投入。我认为这是NH可以改进的一个领域。10000
SimulationObject
s是一个固定的数字,还是未来可能会增长?每个模拟对象平均有多少个ResultItem
s?每个模拟对象有多少个预览数据?每个PreviewData
和ResultItem
有多少个SomeDataItem
s?您是否还需要获取SomeDataItem
s,或者这些子项是否可以延迟加载?在SimulationObject
中,是否PreviewData
和ResultItem
共享它们的SomeDataItem
s?换句话说,给定一个SomeDataItem x
,以下语句是否正确:x.ResultItem.SimulationObject==x.PreviewData.SimulationObject
?如果是这样,那么您就有了一个菱形的关系,这会影响我们需要在这些孙对象上执行多少抓取操作。不,它们不共享关系。事实上,PreviewData项和ResultItem项保存在数据库的不同表中。SomeDataItem类是伪代码。。哦,我在帖子中增加了数量。有没有办法用Linq做到这一点。我不太理解这个QueryOver API..至少在某个地方有什么好的解释吗?这并没有说明当你想要结果时如何去做。第二个查询中的内容将按照博客文章中的指定被丢弃。如果你急切地需要孩子们的桌子怎么办。