Ссылки NHibernateAny Fetching?

У меня есть класс с картой ReferencesAny. Для определенных запросов я получаю ситуацию N+1 на любой карте. Есть ли способ использовать Fetch для любой карты?

Вот как выглядит мой запрос linq (это работает, но низкая производительность из-за N+1):

return Session.Query<Path>().Where(p => {condition}).ToArray().Select(p => p.ContentsObject);

Когда я добавляю выборку в микс:

return Session.Query<Path>().Where(p => {condition}).Fetch(p => p.ContentsObject).Select(p => p.ContentsObject);

Запрос взрывается, говоря, что существует недопустимое соединение.

Исключение:

Недопустимое присоединение: p.Page [.Fetch[wp.cms.DomainModel.Entity.Structure.PagePathMemento,wp.cms.DomainModel.Entity.Base.ILocatablePage](.Where[wp.cms.DomainModel.Entity.Structure.PagePathMemento] (NHibernate.Linq.NhQueryable`1[wp.cms.DomainModel.Entity.Structure.PagePathMemento], Quote((p, ) => (.Any[wp.cms.DomainModel.Entity.Users.UserSite](p.Site .Users, (u, ) => (Guid.op_Equality(u.User.Id, p1)), ))), ), Quote((p, ) => (p.Page)), )] Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: NHibernate.Hql.Ast.ANTLR.InvalidPathException: Недопустимое соединение: p.Page [.Fetch[wp.cms.DomainModel.Entity.Structure.PagePathMemento,wp.cms.DomainModel.Entity.Base.ILocatablePage](.Where [wp.cms.DomainModel.Entity.Structure.PagePathMemento](NHibernate.Linq.NhQueryable`1[wp.cms.DomainModel.Entity.Structure.PagePathMemento], Quote((p, ) => (.Any[wp.cms .DomainModel.Entity.Users.UserSite](p.Site.Users, (u, ) => (Guid.op_Equality(u.User.Id, p1)), ))), ), Quote((p, ) = > (стр.)), )]


person Jereme    schedule 08.02.2012    source источник
comment
Показать полные сообщения об исключениях и внутренних исключениях.   -  person gdoron is supporting Monica    schedule 09.02.2012


Ответы (1)


Я не думаю, что возможно загрузить сопоставления any.

Чтобы избежать N+1, установите разумное значение batch-size для ваших сущностей (скажем, 20 или 50).

См. раздел 19.1.5 Использование пакетной выборки.

person Diego Mijelshon    schedule 08.02.2012
comment
По какой-то причине это не позволяет мне установить размер партии. Когда я пытаюсь использовать Session.SetBatchSize(50), он выдает ошибку: размер партии не был определен для фабрики сеансов, пакетная обработка отключена. Установите adonet.batch_size = 1, чтобы включить пакетную обработку. Я использую генератор ключей NH GuidComb и установил свойство размера пакета в своей конфигурации. Любые идеи? - person Jereme; 09.02.2012
comment
Я имею в виду не тот размер партии. См. класс 5.1.3 (13). - person Diego Mijelshon; 09.02.2012
comment
Теперь я понимаю. Большое спасибо! Это было большим подспорьем. - person Jereme; 09.02.2012