У Ayende есть сообщение в блоге , подробно описывающее, как бороться с проблемой "n + 1" в nHibernate. По сути, проблема заключается в следующем:
Предположим, у вас есть две таблицы: «BlogPosts» и «Комментарии» с отношением «один ко многим» между ними (т.е. каждый BlogPost может иметь несколько комментариев). Теперь предположим, что вы хотите выполнить следующий вложенный цикл:
foreach (BlogPost post in blogposts)
{
foreach (Comment comment in post.Comments)
{
// Do something
}
}
Из того, что я понимаю, классы, которые генерирует SubSonic, по умолчанию являются lazyload (я не хочу отключать это полностью, потому что это полезно в большинстве случаев, только не этот). Это означает, что каждый раз, когда выполняется внутренний цикл (т. Е. При обращении к post.Comments), в базу данных необходимо отправлять отдельный запрос для получения комментариев.
Таким образом, если у вас 80 постов в блоге, это 1 запрос для получения списка постов в блоге, а затем 80 запросов для получения комментариев к каждому из них. Однако, если комментарии были загружены с нетерпением, это было бы уменьшено до 1 запроса.
Есть ли способ борьбы с этой проблемой в SubSonic в настоящее время?