NHibernate объединение в иерархию - PullRequest
0 голосов
/ 20 января 2011

У меня Проекты в иерархии

Project1.Projects
     +- Project1.1
     +- Project1.2
Project2.Projects
     +- Project2.1
     +- Project2.2
Project3.Projects
     +- Project3.1

Пользователям назначаются разрешения для проекта через UserProject

User.Id --> UserProject.Id.UserId
            UserProject.Id.ProjectId --> Project.Id

(Да, это составной идентификатор, извините ... устаревшая база данных, что вы собираетесь делать ...)

Теперь мне нужен список всех лучших проектов, в которых конкретный пользователь имеет доступ к проекту или хотя бы к одному из подпроектов .

Так что, если у UserA есть доступ к Project1 и Project3.1, я хочу получить список, содержащий Project1 и Project3 (, а не 3.1 ), предпочтительно с некоторой информацией о том, что у пользователя нет прав для Project3.

В базе данных проекты хранятся в плоском виде с родительской ссылкой:

Project:
| Project_ID | Parent_project_id | HasSubProjects | ... |

UserProject
| ProjectID | UserId | other properties... |

Есть предложения по эффективному способу вернуть то, что я хочу?

Обновление : я закончил с массивным SQL-оператором, использующим объединения и иерархические объединения. Довольно зверь. Спасибо за помощь.

1 Ответ

1 голос
/ 20 января 2011

Я думаю, что вы хотите присоединить свою таблицу ссылок к своей таблице проекта, начните с набора, к которому у вашего пользователя есть прямой доступ, а затем просмотрите ваше дерево, используя connect by before:

    select ProjectID from UserProject u
inner join Project p
        on u.ProjectID = p.Project_ID
start with UserId = @foo
connect by prior Parent_Project_id = Project_ID

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

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