Я создаю приложение для опроса, в котором у меня есть опрос, в котором есть коллекция страниц.На каждой странице будет набор вопросов, и каждый вопрос будет иметь набор вариантов ответов.Моя структура классов выглядит следующим образом:
public class Survey : Entity {
public IList<Page> Pages { get; set; }
}
public class Page : Entity {
public IList<Question> Questions { get;set; }
}
public class Question : Entity {
public IList<Option> Options { get; set; }
}
public class Option : Entity {}
Отображение для каждого класса:
<!-- mapping for ID and other properties excluded -->
<class name="Survey">
<bag name="Pages" generic="true" inverse="true">
<key column="SurveyId" />
<one-to-many class="Page" />
</bag>
<bag name="Questions" access="none">
<key column="SurveyId" />
<one-to-many class="Question" />
</bag>
</class>
<class name="Page">
<many-to-one name="Survey" column="SurveyId" />
<bag name="Questions" generic="true" inverse="true">
<key column="PageId" />
<one-to-many class="Question" />
</bag>
</class>
<class name="Question">
<many-to-one name="Page" column="PageId" />
<many-to-one name="Survey" column="SurveyId" />
<bag name="Options" generic="true" inverse="true">
<key column="QuestionId" />
<one-to-many class="Option" />
</bag>
</class>
<class name="AnswerOption">
<many-to-one name="Question" column="QuestionId" />
</class>
Мне нужно отобразить все вопросы на странице, поэтому я начну с объекта опроса и циклачерез страницы, предметы и опции.Это заставляет NHibernate выполнять много запросов, и я хотел бы оптимизировать это.Как получить объект опроса с вложенными коллекциями наилучшим образом, не выполняя слишком много запросов?
Это код, который у меня есть в данный момент, но он все еще выполняет много запросов:
var result = Session.CreateMultiQuery()
.Add(Session.CreateQuery("from Survey s inner join fetch s.Pages where s.Id = :id"))
.Add(Session.CreateQuery("from Survey s inner join fetch s.Question where s.Id = :id"))
.SetInt32("id", id)
.List();
IList list = (IList)result[0];
return list[0] as Survey;
Я также пробовал запросы на будущее, но они не помогают сократить количество запросов.
Есть идеи?