NHibernate Иерархическая выборка данных с помощью одного запроса

У меня есть таблица в БД, где столбцы, как показано ниже.

Id   Name     Publisher          ParentId
------------------------------------------    
100  Sample1  ExamplePublisher   NULL
200  Sample2  ExamplePubl3       100

Отображение NHibernate показано ниже.

   <class name="PaperMaster">
        <composite-id>
            <key-property name="Id"></key-property>
            <key-property name="AreaId"></key-property>
        </composite-id>       
        <property name="Name"></property>
        <property name="Parent"></property>
        <property name="Publisher"></property>
        <property name="YearStarted"></property>
        <bag name="ChildCollection" table="PaperMaster" lazy="false" 
                  inverse="true">
            <key>
                <column name="Parent"></column>
                <column name="AreaId"></column>
            </key>
           <key column="Parent"></key>
            <one-to-many class="PaperMaster"></one-to-many>
        </bag>        
        <many-to-one name="ParentObject" column="Parent">
            <column name="Parent"></column>
            <column name="AreaId"></column>
        </many-to-one>        

    </class>

Когда я запрашиваю NHIbernate, как показано ниже, я успешно получаю объект с правильно заполненными дочерними коллекциями.

   IList<PaperMaster> allList = se.CreateQuery("select e from PaperMaster e join fetch
      e.ChildCollection where e.Id=100")
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .List<PaperMaster>();

Проблема, с которой я сталкиваюсь, заключается в том, что для каждого ребенка выполняется запрос для заполнения объекта, который кажется очень дорогостоящим. Есть ли способ упростить это? Например, в одном запросе я должен получить полное отношение.


person Thanigainathan    schedule 05.04.2011    source источник
comment
Я был поражен, узнав, что несвязанные объекты могут быть объединены в NHibernate с помощью HQL. Очень хорошая функция. Пожалуйста, обратитесь к этой статье. codewrecks.com/blog/index.php/2009/09/04/   -  person Thanigainathan    schedule 06.06.2011


Ответы (1)


Один из способов уменьшить количество запросов — добавить batch-size="25" к карте сумки.

e.g.

 <bag name="ChildCollection" table="PaperMaster" lazy="false"
     batch-size="25" inverse="true">

Это резко уменьшит количество запросов.

person Rippo    schedule 06.04.2011
comment
Спасибо за ваше предложение. Будет ли это успешно работать на веб-фермах? Это самая большая проблема, поскольку у нас нет сервера состояний. - person Thanigainathan; 06.04.2011
comment
Я не уверен, почему это не сработает. Вы по-прежнему будете получать несколько запросов с одного веб-сервера, но вместо 100 вы получите 4 (то есть, если batch-size="25") - person Rippo; 06.04.2011
comment
В основном вы получаете 1 запрос на каждые 25 запросов, поэтому выбор n + 1 не является проблемой. - person Rippo; 06.04.2011
comment
Извините за обращение к веб-ферме как к проблеме. Я преодолел проблему, открыв сеанс и закрыв в событиях OnActionExecuting и OnActionExecuted в MVC. - person Thanigainathan; 06.06.2011