2016-04-01 12 views
3

そのタイトルはあまりよくないので、次の点を考慮してください。私は5つのテーブルがあります。TSQL - 複数の結合パスを持つテーブルから選択

をそして私はそれに直接または間接的にプロファイルを介してリンクされているユーザーのアクセス許可のすべてを取得します。ない-かなり-そこに私がこれまでに作ってみたSQLはこれです:

SELECT [Pe].[Controller], 
     [Pe].[Action] 
FROM [PermissionSets] AS [PS] 
     JOIN [UserPermissionSets] AS [UPS] 
      ON ([UPS].[PermissionSetId] = [PS].[Id]) 
     JOIN [Users] AS [U] 
      ON ([U].[Id] = [UPS].[UserId]) 
     JOIN [Profiles] AS [P] 
      ON ([P].[Id] = [U].[ProfileId]) 
     JOIN [ProfilePermissionSets] AS [PPS] 
      ON ([PPS].[ProfileId] = [P].[Id]) 
     JOIN [Permissions] AS [Pe] 
      ON ([Pe].[PermissionSetId] = [PS].[Id]) 
WHERE [U].[Id] = 4; 

それは、行の正しい数を戻るが、それは間違っているので、それは、何度も、コントローラやアクションを繰り返しています。私は、誰かがそれを修正して、そのユーザーのためのすべての異なるアクセス権セットを表示するのを助けることを願っています。理想的には、私はこれを変更して、ユーザーから始まるすべてが発見されるようにしたいのですが、これは私がこれを行うために必要なメソッドにアクセスできるものです(オブジェクトはUserという名前のEntity Frameworkクラスであり、 LINQ)。私は本当には権限ない権限セットを望んでいたことを忘れてしまったので

を更新しました。

+0

あなたは 'GROUP BY'を探していますか? – ZLK

+0

わかりません、私は自分自身のために問題を引き起こすのに十分なSQLを知っています。 – Gup3rSuR4c

+0

ユーザは常に_UserPermissionSets_テーブルに少なくとも1つのエントリを持っていますか?そうでない場合は、_UserPermissionSets_または_UserPermissionSets_および_Permissions_にエントリを持つユーザーのみを取得します。その後、LEFT OUTER JOINを使用してください。 – schlonzo

答えて

1

SELECT [Pe].[Controller], 
     [Pe].[Action] 
FROM [Users] AS [U] 
    LEFT OUTER JOIN [UserPermissionSets] AS [UPS] 
      ON ([UPS].[UserId] = [U].[Id]) 
    LEFT OUTER JOIN [ProfilePermissionSets] AS [PPS] 
      ON ([PPS].[ProfileId] = [U].[ProfileId]) 
    LEFT OUTER JOIN [Permissions] AS [Pe] 
      ON ([Pe].[PermissionSetId] = [UPS].[PermissionSetId]) 
      OR ([Pe].[PermissionSetId] = [PPS].[PermissionSetId]) 
WHERE [U].[Id] = 4; 
+0

に行く方法だと思うのは、直接関連する権限だけを生成し、間接的に関連する権限をプロファイルから除外します。 – Gup3rSuR4c

+0

@ Gup3rSuR4c、クエリが変更されました。今すぐplz chk –

+0

私はあなたの例を「DISTINCT」に洗練し、私が望む結果を得ました。私はそれをビューにして、EF実装の 'User'クラスからそれと偽の関係を作りました。 LINQを実装した場合と比較して、クエリを1つに減らすことができます。ありがとう! – Gup3rSuR4c

0

だから、このSQLを試してみてくださいLINQPadにいじり、私はこの思い付いた限りLINQクエリとして:

user.PermissionSets.Union(user.Profile.PermissionSets).SelectMany(
    ps => 
     ps.Permissions.Select(
      p => 
       p.Controller + "." + p.Action)); 

そして、それは私が欲しいものを生成するが、それがありませんそれは一連のSQLクエリーの結果を合成することによって達成されます。最も大きな影響は、管理者といった複数の権限セットを持つプロファイルにあります。私はそこに道があるとは思わないし、Userオブジェクトしか持っていないので、少なくとも今は余分なSQLクエリで大丈夫だ。

関連する問題