Установите Ленивую загрузку вашей коллекции на Lazy
или Extra
, возможно, ваша установлена на NoLazy
(иначе - готовность к загрузке).
Лучше установить его на Extra
вместо Lazy
.Поскольку это не позволит NHibernate извлекать строки для дочерней коллекции, когда вы хотите получить только .Count()
или .Any()
дочерней коллекции.Extra
походит на более ленивую версию ленивых :)
С NoLazy / eager-loading :
var post = session.Get<Post>(1);
Это будет читатьодна строка из таблицы сообщений и строки из таблицы комментариев из базы данных, даже если вы не обращались к комментариям дочерней коллекции сообщения из вашего приложения.
Использование Lazy
, var post = session.Get<Post>(1)
приведет ктолько загружая одну строку из таблицы сообщений, NHibernate не будет читать комментарии дочерней коллекции сообщения из базы данных.
Что касается Lazy vs Extra
Использование Lazy :
var commentsCount = post.Comments.Count()
Это загрузит комментарии поста из базы данных:
select * from comments where post_id = 1;
И .Count()
, происходит только на стороне приложения.
Использование Extra , var commentsCount = post.Comments.Count()
, NHibernate будет выдавать только запрос подсчета вместо чтения всех строк.
select count(*) from comments where post_id = 1
Вот пример конфигурации для установки механизма загрузки дочерней коллекции, есливы используете автоматическое отображение NHibernate, вы устанавливаете эти настройки на BeforeMapSet событие:
И когда вам нужно загружать дочернюю коллекцию, настроенную как Lazy
или Extra
,использовать FetchMany