Я видел похожие ответы на вопросы, где у вас есть единая сущность и вы хотите загрузить все свои коллекции с помощью нескольких запросов (вместо большого набора объединений):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();
Эта техника не похоже, работают для списка детей внутри CollectionType1, который также является списком CollectionType1. Есть ли что-то особенное, что мне нужно сделать, чтобы проверить его на кеш? – mikeschuld
NHibernate обычно помещает каждый загруженный объект в кеш уровня 1. Когда вы снова загружаете его с помощью другой выбранной коллекции, NHibenate должен увидеть, что она уже есть и слияние. Я делал это раньше, за исключением использования 'ToFuture()', чтобы избежать двух поездок в базу данных, но это не должно меняться. NH игнорирует последний запрос или заменяет первый? – Andre
Я думаю, что проблема в automapper где-то. При сопоставлении свойств над ним, похоже, выполняется другой запрос, чтобы получить дочерние элементы WHERE ParentId = ###, а не искать в кеше WHERE ChildId = ### – mikeschuld