2009-12-16 2 views
0

Надетый на этом. У меня многие ко многим самостоятельно ссылающегося отношения (FluentNH) отображается для данного класса:Добавление критериев для фильтрации с помощью собственного референтного родителя?

public class Folder 
{ 
    public IList<Folder> ParentFolders{get;set;} 
} 

Я ищу, чтобы создать запрос, который вытягивает корневые папки (т.е. папки, которые имеют ParentFolders.Count() == 0). Самостоятельная ссылка выполняется с помощью таблицы поиска, поэтому ParentFolderID фактически не доступен из класса (отображается только при отображении).

public IList<Folder> GetRootFolders() 
{ 
    return session.CreateCriteria<Folder>() 
     .outofideas() 
     .List<Folder>(); 
} 

Любые помощь или мысли по иерархии самореференций через таблицу поиска весьма ценятся. Сами таблицы являются устаревшими и поэтому не могут быть изменены.

ответ

0

Если отображение имеет что-то вроде этого:

<bag name="ParentFolders" table="FolderFolder" lazy="true"> 
    <key column="FolderID"/> 
    <many-to-many class="Folder" column="ParentFolderID"/> 
</bag> 

затем, если вы пишете:

var folders = Session.CreateCriteria<Folder>("folder") 
    .Add(Restrictions.IsEmpty("ParentFolders")).List<Folder>(); 

вы получите этот SQL:

SELECT * 
FROM Folder folder 
WHERE not exists (select 1 from FolderFolder where folder.FolderID=FolderID) 

, что я считаю, делает трюк ,

0

Я всегда нашел, что NHibernate's Criteria сложно работать. (То есть - даже больше сложно, чем остальная часть NHibernate.) Попробуйте вместо этого создать HQL-запрос. Не видя файл сопоставления Я не могу написать запрос для вас, но это будет что-то вроде:

session.CreateQuery("FROM Folder f WHERE COUNT(f.ParentFolders) = 0") 

Вы должны были бы играть с синтаксисом немного, я пишу это из памяти. Обратите внимание, что NHibernate достаточно умен, чтобы выполнить подзапрос для COUNT - он фактически не загрузит все ваши родительские папки и , а затем посчитает их.

Смежные вопросы