У меня есть следующая структура: сообщение (таблица сообщений) может иметь несколько полей (таблица полей), и каждое поле может иметь несколько подполей (хранящихся в одной и той же таблице «полей» с той лишь разницей, что поля не имеют значений в Столбец "ParentField"). Подполя могут иметь подполя и т. Д., Но это не важно.
Когда я получаю 10 сообщений, каждое из которых содержит 10 полей, а каждое поле имеет 20 подполей, я вижу из файла журнала, что NHibernate генерирует 2000 вызовов SQL.
Есть ли способ оптимизировать это?
Спасибо!
Вот один из 2000 операторов SQL, сгенерированных NHibernate:
SELECT fieldresul0_.MessageResults_ID as MessageR6___2_,
fieldresul0_.ID as ID2_,
fieldresul0_.ID as ID5_1_,
fieldresul0_.Field_ID as Field2_5_1_,
fieldresul0_.Name as Name5_1_,
fieldresul0_.Value as Value5_1_,
fieldresul0_.MessagePosition as MessageP5_5_1_,
fieldresul0_.MessageResults_ID as MessageR6_5_1_,
fieldresul0_.ParentField_ID as ParentFi7_5_1_,
fieldresul1_.ID as ID5_0_,
fieldresul1_.Field_ID as Field2_5_0_,
fieldresul1_.Name as Name5_0_,
fieldresul1_.Value as Value5_0_,
fieldresul1_.MessagePosition as MessageP5_5_0_,
fieldresul1_.MessageResults_ID as MessageR6_5_0_,
fieldresul1_.ParentField_ID as ParentFi7_5_0_
FROM FieldResults fieldresul0_
LEFT OUTER JOIN FieldResults fieldresul1_
ON fieldresul0_.ParentField_ID=fieldresul1_.ID
WHERE fieldresul0_.MessageResults_ID=@p0
ORDER BY fieldresul0_.MessagePosition
Вот файл сопоставления, который генерирует ActiveRecord:
<?xml version="1.0" encoding="utf-16"?>
<hibernate-mapping auto-import="true" default-lazy="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:nhibernate-mapping-2.2">
<class name="FieldResult, Data" table="FieldResults">
<id name="ID" access="property" column="ID" type="Int32" unsaved-value="0">
<generator class="native">
<param name="sequence">FieldResults_ID</param>
</generator>
</id>
<property name="FieldID" access="property" type="String">
<column name="Field_ID"/>
</property>
<property name="Name" access="property" type="String">
<column name="Name"/>
</property>
<property name="DisplayValue" access="property" type="String">
<column name="Value"/>
</property>
<property name="MessagePosition" access="property" type="Int32">
<column name="MessagePosition"/>
</property>
<many-to-one name="ParentMessage" access="property" class="MessageResult, Data" column="MessageResults_ID" />
<many-to-one name="ParentField" access="property" class="FieldResult, Data" column="ParentField_ID" />
<bag name="Children" access="property" table="FieldResults" lazy="false" cascade="all" order-by="Field_ID">
<key column="ParentField_ID" />
<one-to-many class="FieldResult, Data" />
</bag>
</class>
</hibernate-mapping>`