具有MultiQuery / MultiCriteria的NHibernate Eager Load集合在起始点是List <entity> </entity>

时间:2014-08-18 17:34:26

标签: c# linq nhibernate automapper

我已经看到类似的答案,你有一个单一的实体,并希望使用多个查询(而不是一大组连接)加载所有集合:

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();

1 个答案:

答案 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两次,如果他们有大量数据或非常大的文本字段,这可能会很慢......