に参加し、私ははい、それは、複合IDです( NHibernateのは、階層
User.Id --> UserProject.Id.UserId
UserProject.Id.ProjectId --> Project.Id
UserProject経由
Project1.Projects
+- Project1.1
+- Project1.2
Project2.Projects
+- Project2.1
+- Project2.2
Project3.Projects
+- Project3.1
ユーザーがプロジェクトにアクセス権を割り当てられている階層内プロジェクトを持っています、申し訳ありません...レガシーデータベース、何をするつもりか...)
今、私はすべてのトップのリストが必要です特定のユーザがプロジェクトにアクセスするプロジェクト、またはサブプロジェクトの少なくとも1つを含むプロジェクト。
UserAがProject1とProject3.1にアクセスできる場合、私はProject1とProject3(ではなく、3.1ではない)を含むリストを取得することをお勧めします。私が欲しいものを取り戻すための効果的な方法で
Project:
| Project_ID | Parent_project_id | HasSubProjects | ... |
UserProject
| ProjectID | UserId | other properties... |
任意の提案:
データベースではプロジェクトは親リンクを平らに保存されていますか?
更新:ユニオンと階層結合を使用して大量のSQL文が作成されました。かなりの獣。助けてくれてありがとう。 「
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
私はドン:
彼はCreateSQLQuery()を使う必要があります。なぜなら、NHibernateは 'start with ... by prior'を再設定しないからです。それは彼のデータベースの大きさに応じて、手動でツリーを移動することができます。 – Mike
構文エラーはありませんが、データベース内のほとんどすべてのUserProjectレコード(8.904.856/8.973.093)を返していますので、そこに何か問題があります:)もう少し詳しく見ていきますが、いくつかの別々のルックアップとカウント。ありがとうございました!今日も何か新しいことを学びました。 – henriksen
良い点マイク。 「先に接続する」という言葉を忘れたのは、Oracle固有の構文です。つまり、Oracleタグを前提とすると、バックエンドにOracleがあることを前提としているため、PL/SQLなどを使用して実行できます。 – dataduck