2011-01-20 10 views
0

に参加し、私ははい、それは、複合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 

私はドン:

答えて

1

は、私はあなたの前で接続し、プロジェクトのテーブルの上にあなたのリンクテーブルに参加するユーザーが直接にアクセスすることがセットで起動し、使用してツリーをトラバースしたいと思いますこれをテストするための何かがあるので、いくつかの構文エラーがあるかもしれませんが、それはあなたが使いたい基本的な考え方です。

+0

彼はCreateSQLQuery()を使う必要があります。なぜなら、NHibernateは 'start with ... by prior'を再設定しないからです。それは彼のデータベースの大きさに応じて、手動でツリーを移動することができます。 – Mike

+0

構文エラーはありませんが、データベース内のほとんどすべてのUserProjectレコード(8.904.856/8.973.093)を返していますので、そこに何か問題があります:)もう少し詳しく見ていきますが、いくつかの別々のルックアップとカウント。ありがとうございました!今日も何か新しいことを学びました。 – henriksen

+0

良い点マイク。 「先に接続する」という言葉を忘れたのは、Oracle固有の構文です。つまり、Oracleタグを前提とすると、バックエンドにOracleがあることを前提としているため、PL/SQLなどを使用して実行できます。 – dataduck

関連する問題