NHibernate Отзывы Любая загрузка? - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть класс с картой 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] (. Там, где [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] (. Где [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)),))),), Цитата ((p,) => (p.Page)),)]

1 Ответ

4 голосов
/ 09 февраля 2012

Я не думаю, что можно загружать any отображений.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...