2016-04-01 44 views
3

该标题不太好,因此请考虑以下事项。我有五个表格: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的实体框架类,将使用LINQ)。

UPDATED因为我忘了我真的想要的权限不是权限集。

+0

你只是在寻找'GROUP BY'? – ZLK

+0

不知道,我知道足够的SQL来为自己造成问题,哈哈。 – Gup3rSuR4c

+0

用户是否总是在_UserPermissionSets_表中至少有一个条目?如果不是,则只能检索在_UserPermissionSets_或_UserPermissionSets_和_Permissions_中具有条目的用户。那么你应该使用'LEFT OUTER JOIN'。 – schlonzo

回答

1

试试这个SQL

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实现。谢谢! – Gup3rSuR4c

0

因此,在LINQPad乱搞,我想出了这个只要LINQ查询:

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

它产生我想要的东西,但它确实它通过组合一堆SQL查询的结果。最大的影响来自具有多个权限集的配置文件,例如管理员。我认为没有办法解决这个问题,并且我只有一个User对象可以使用,所以我对于多余的SQL查询很满意,至少现在是这样。