2014-08-18 1 views
0

Я видел похожие ответы на вопросы, где у вас есть единая сущность и вы хотите загрузить все свои коллекции с помощью нескольких запросов (вместо большого набора объединений):NHibernate Eager Load Collections with MultiQuery/MultiCriteria, когда отправной точкой является Список <Entity>

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 для создания этих объединений, предполагая, что у меня нет сингла e 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

Это работает точно так же, как с единым целым, так как все они будут в кэше:

session.Linq<ContainerType>() 
    .FetchMany(container => container.collection2) 
    .ToFuture(); 

List<ContainerType> containers = session.Linq<ContainerType>() 
    .FetchMany(container => container.collection) 
    .ThenFetchMany(collection => collection.childCollection) 
    .ToList(); 

Единственная проблема заключается в том, что он будет извлекать все container дважды, что может быть медленным, если у них много данных или очень большие текстовые поля ...

+0

Эта техника не похоже, работают для списка детей внутри CollectionType1, который также является списком CollectionType1. Есть ли что-то особенное, что мне нужно сделать, чтобы проверить его на кеш? – mikeschuld

+0

NHibernate обычно помещает каждый загруженный объект в кеш уровня 1. Когда вы снова загружаете его с помощью другой выбранной коллекции, NHibenate должен увидеть, что она уже есть и слияние. Я делал это раньше, за исключением использования 'ToFuture()', чтобы избежать двух поездок в базу данных, но это не должно меняться. NH игнорирует последний запрос или заменяет первый? – Andre

+0

Я думаю, что проблема в automapper где-то. При сопоставлении свойств над ним, похоже, выполняется другой запрос, чтобы получить дочерние элементы WHERE ParentId = ###, а не искать в кеше WHERE ChildId = ### – mikeschuld

Смежные вопросы