from itertools import izip_longest
def chunker(iterable, chunksize, filler):
return izip_longest(*[iter(iterable)]*chunksize, fillvalue=filler)
См. Сайт Айенде: Эффективный выбор дерева . Я успешно использовал эту технику в своих приложениях. С ICriteria это выглядит так:
session.CreateCriteria<Category>()
.SetFetchMode("SubCategories", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Category>()
.Where(x => x.ParentCategory == null);
Основное различие между этой версией и тем, что вы пробовали, заключается в том, как применяется фильтр «ParentCategory == null». Его нужно исключить из запроса, который отправляется в базу данных, чтобы получить все дерево, но нам все еще нужен запрос, чтобы возвращать только корневые узлы дерева, поэтому мы будем использовать linq для поиска тех, которые находятся после запрос к базе данных завершен.
Not sure if it helps but take a look at : map a tree in NHibernate