При выполнении запроса, подобного этому (используя Nhibernate 2.1.2):
ICriteria criteria = session.CreateCriteria<MyRootType>()
.SetFetchMode("ChildCollection1", FetchMode.Eager)
.SetFetchMode("ChildCollection2", FetchMode.Eager)
.Add(Restrictions.IdEq(id));
Я получаю несколько повторяющихся объектов в некоторой декартовой манере. Например. если ChildCollection1
имеет 3 элемента, а ChildColection2
имеет 2 элемента, то я получаю результаты с каждым элементом в ChildColection1
один дубликат, а каждый элемент в ChildColection2
трижды! Это был для меня момент WTF ...
Так как это сделать правильно?
- Поддерживается ли использование SetFetchMode, как это, поддерживается только при указании одной коллекции?
- Я просто неправильно его использую (я видел некоторые ссылки на преобразователи результатов, но предполагал, что это будет проще).
- Это что-то особенное в NH3?
Обновление:
Согласно предложению Феличе, я пытался использовать преобразователь DistinctRootEntity, но он по-прежнему возвращает дубликаты. Код:
ICriteria criteria = session.CreateCriteria<MyRootType>()
.SetFetchMode("ChildCollection1", FetchMode.Eager)
.SetFetchMode("ChildCollection2", FetchMode.Eager)
.Add(Restrictions.IdEq(id));
criteria.SetResultTransformer(Transformers.DistinctRootEntity);
return criteria.UniqueResult<MyRootType>();