Добавление критериев для фильтрации по самореферентному родителю? - PullRequest
0 голосов
/ 17 декабря 2009

Остановился на этом. У меня есть сопоставленные отношения «многие ко многим» (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>();
}

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

Ответы [ 2 ]

0 голосов
/ 17 декабря 2009

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

<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 голосов
/ 17 декабря 2009

Мне всегда было трудно работать с Criteria в NHibernate. (То есть даже на 1002 * сложнее сложнее, чем в остальной части NHibernate.) Вместо этого попробуйте создать запрос HQL. Не видя файл сопоставления, я не могу написать запрос для вас, но это будет что-то вроде:

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

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

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