我在DB中有一个表,其中的列如下所示。
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>();
我面临的问题是每个孩子都会运行一个查询来填充对象,这似乎非常昂贵。有没有办法简化这个?例如,在单个查询中,我应该能够获得完整的关系。
答案 0 :(得分:1)
减少查询量的一种方法是在包映射上添加batch-size="25"
。
e.g。
<bag name="ChildCollection" table="PaperMaster" lazy="false"
batch-size="25" inverse="true">
这将大大减少查询量。