NHibernate Иерархическая выборка данных с помощью одного запроса - PullRequest
0 голосов
/ 05 апреля 2011

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

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>();

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

1 Ответ

1 голос
/ 06 апреля 2011

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

, например

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

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

...