我已经看到类似的答案,你有一个单一的实体,并希望使用多个查询(而不是一大组连接)加载所有集合:
NHibernate Multiquery for eager loading without joins
我的问题是,当查询的起点是实体列表时,你如何做类似的事情。
详情
类型:ContainerType,CollectionType1,CollectionType2,CollectionType [3 .... 10]
ContainerType {
List<CollectionType1> collection;
List<CollectionType2> collection2;
}
CollectionType1 {
List<CollectionType1> childCollection;
List<CollectionType3> childCollection3;
...
List<CollectionType10> childCollection10;
}
我想避免什么
List<ContainerType> containers = new Session.Linq<ContainerType>()
.FetchMany(container => container.collection)
.ThenFetchMany(collection => collection.childCollection)
.FetchMany(container => container.collection2)
.ToList();
有没有办法使用multiquery / multicriteria来设置这些连接,假设我没有单个Id我可以将它们全部关联起来?
我最终如何按需运作
Session.Linq<ContainerType>
.FetchMany(container => container.CollectionType1s)
.ToList();
Session.Linq<CollectionType1>
.FetchMany(parent => parent.Children)
.ToList();
Session.Linq<CollectionType1>
.FetchMany(allType1s => allType1s.CollectionType3)
.ThenFetchMany(type3 => type3.CollectionType3_1) // etc.
// etc.
.ToList();
// etc.
List<ContainerType> containers = Session.Linq<ContainerType>()
.ToList();
答案 0 :(得分:1)
它与单个实体完全相同,因为它们都在缓存中:
session.Linq<ContainerType>()
.FetchMany(container => container.collection2)
.ToFuture();
List<ContainerType> containers = session.Linq<ContainerType>()
.FetchMany(container => container.collection)
.ThenFetchMany(collection => collection.childCollection)
.ToList();
唯一的问题是它会获取所有container
两次,如果他们有大量数据或非常大的文本字段,这可能会很慢......