В моем приложении у меня есть объект домена категории.Категория имеет свойство 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 возвращается в мою модель домена.
Спасибо