Мой вопрос очень похож на этот (на который действительно не было ответа): Nhibernate: отличные результаты в коллекции второго уровня
У меня есть эта объектная модель:
class EntityA
{
...
IList<EntityB> BList { get; protected set; }
...
}
class EntityB
{
... does NOT reference its parent EntityA...
IList<EntityC> CList { get; protected set; }
}
Это отношения один-ко-многим.EntityB и C не имеют ссылку на объект для своего родительского объекта.
Я бы хотел полностью загрузить коллекции, выполнив что-то вроде следующих трех запросов SQL, чтобы избежать декартового объединения:
SELECT id, ... FROM EntityA;
SELECT id, idA, ... FROM EntityB;
SELECT id, idB, ... FROM EntityC;
При этом DAL обладает всей информацией для правильного заполнения объектов.Но поскольку EntityB не знает, кто его родитель, он имеет для nHibernate, который позаботится о правильном заполнении коллекций.
Можно ли это сделать ??
Я мог бы сделать этот обходной путь с Декартовым продуктом, но это требует модификации моей модели, чтобы обеспечить установку сборщика, и это квалифицируется как исправление для технической проблемы с DAL в моем уме.
ICriteria criteria = session.CreateCriteria<EntityA>()
.SetFetchMode("BList", FetchMode.Join)
.SetFetchMode("BList.CList", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer());
IList<EntityA> listA = criteria.List<EntityA>();
foreach (EntityA objA in listA) {
objA.BList = objA.BList.Distinct().ToList();
foreach (EntityB objB in objB.BList) {
objB.CList = objB.CList.Distinct().ToList();
}
}