2013-12-07 5 views
1

У меня есть эта схема:NHibernate - список родителей и сбор ребенка

enter image description here

Я уже сделал ManyToMany отображение между Post и Tag. То, что я пытаюсь достичь, - это получить список сообщений и для каждой публикации его дочерней коллекции тегов. Так он может отображаться как это:

enter image description here

То, что я сделал до сих пор это:

IList<Post> results = base._session.CreateCriteria(typeof(Post)) 
    .SetFetchMode("User", FetchMode.Eager) 
    .SetFetchMode("Votes", FetchMode.Eager) 
    .AddOrder(Order.Desc("_dateCreated")) 
    .ToList(); 

Но для каждого Post это делает 1 дополнительный SQL для извлечения Votes. Есть ли способ получить его за один раз?

ответ

1

Решение в этом случае может/должно быть взятием партии. Здесь: 19.1.5. Using batch fetching вы можете найти более подробную информацию.

Вы должны пометить свои коллекции и/или объекты атрибутом batch-szie="25".

XML:

<bag name="Tags" ... batch-size="25"> 
... 

свободно:

HasManyToMany(x => x.Tags) 
    ... 
    .BatchSize(25) 

Это будет по-прежнему выполнять несколько SQL SELECT заявления, а не только один, но гибкость вы получаете будет значительным.

Здесь я попытался объяснить, почему партия выборка является правильный путь: NHibernate QueryOver with Fetch resulting multiple sql queries and db hits

В конце концов, мы можем использовать простые запросы (не явная выборка), потому что batch-size уменьшит количество SQL-заявлений, выданных для получения всех необходимых ленивых нагрузок ...

+0

Для списка из 10 записей заголовков, отображаемых на странице, он уменьшил 11 SQL до 2. Brilliant. Благодаря! –

+0

Отлично, если это помогло;) Наслаждайтесь NHiberante .. удивительный инструмент –

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