Запрос самоссылочного соединения с помощью NHibernate Linq - PullRequest
1 голос
/ 10 июня 2010

В моем приложении у меня есть объект домена категории.Категория имеет свойство Parent (типа category).

Итак, в моем отображении NHibernate у меня есть:

    <many-to-one name="Parent" column="ParentID"/>

До того, как я переключился на NHibernate, у меня было свойство ParentId в моей модели домена (сопоставленное)в соответствующий столбец базы данных).

Это упростило запрос, скажем, всех категорий верхнего уровня (ParentID = 0):

where(c => c.ParentId == 0)

Однако с тех пор я удалил свойство ParentId измоя модель домена (из-за NHibernate), поэтому теперь мне нужно выполнить тот же запрос (используя NHibernate.Linq), например так:

        public IList<Category> GetCategories(int parentId) {
        if (parentId == 0)
            return _catalogRepository.Categories.Where(x => x.Parent == null).ToList();
        else
            return _catalogRepository.Categories.Where(x => x.Parent.Id == parentId).ToList();
    }

Реальное влияние, которое я вижу, - это генерируемый SQL.Вместо простого 'выберите x, y, z из категорий, где parentid = 0', NHibernate генерирует левое внешнее соединение:

SELECT this_.CategoryId    as CategoryId4_1_,
   this_.ParentID      as ParentID4_1_,
   this_.Name          as Name4_1_,
   this_.Slug          as Slug4_1_,
   parent1_.CategoryId as CategoryId4_0_,
   parent1_.ParentID   as ParentID4_0_,
   parent1_.Name       as Name4_0_,
   parent1_.Slug       as Slug4_0_

FROM Категории this_ left external Join Категории parent1_ on this_.ParentID = parent1_.CategoryIdГДЕ this_.ParentID имеет значение null

Что не кажется намного менее эффективным, чем то, что у меня было раньше.

Есть ли лучший способ запроса этих самоссылающихся объединений, поскольку очень заманчиво отброситьПо этой причине ParentID возвращается в мою модель домена.

Спасибо

1 Ответ

0 голосов
/ 10 июня 2010

Моей первой реакцией было бы: да - так оно и есть. Не делая ничего, NHibernate всегда пытается загрузить весь элемент - и это означает, что он также загружает родительский элемент. Это действительно проблема с производительностью или эстетическая проблема? И я не думаю, что включение родительского идентификатора поможет вам - потому что оно все равно будет загружать родительский элемент вместе с ним.

Но если вы действительно хотите оптимизировать это, прочитайте следующую статью http://www.javalobby.org/java/forums/t20533.html. Это о Hibernate, но дает вам некоторые идеи о том, как справиться с этим и (возможно) решение вашей проблемы.

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