2016-04-01 21 views
3

Bu başlık çok iyi değil, dolayısıyla aşağıdakileri göz önünde bulundurun. Beş tablolar vardır:TSQL - Birden çok birleşim yolu olan tablodan seçim yapın

Ve ona doğrudan veya dolaylı profil aracılığı ile bağlandığı bir kullanıcı için tüm izinlere almak istiyorum. değil oldukça orada şimdiye kadar ile geldim SQL şudur:

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; 

Bu satırların doğru sayımını geri döner, ama yanlış yüzden, tekrar tekrar kontrolörü veya eylemi tekrarlıyor. Birisi, kullanıcı için tüm farklı izin kümelerini göstermek için düzeltmeme yardımcı olabileceğini umuyorum. İdeal olarak, aynı zamanda kullanıcı tarafından baştan keşfedilen her şeyi değiştirmeyi de isterim çünkü bunu yapmak için ihtiyacım olan yöntemde erişebileceğim şey budur (nesne User adlı bir Varlık Çerçeve sınıfıdır ve kullanılarak göz atılacaktır) LINQ).

GÜNCELLEME Ben gerçekten izinler değil izin kümeleri istediğini olduğunu unuttuğu için.

+0

Sadece GROUP BY' arıyorsunuz? – ZLK

+0

Emin değilim, kendim için sorun yaratacak kadar SQL biliyorum, lol. – Gup3rSuR4c

+0

Bir kullanıcı _UserPermissionSets_ Tablosunda her zaman en az bir giriş var mı? Değilse, sadece _UserPermissionSets_ veya _UserPermissionSets_ ve _Permissions_ içinde bir girişi olan kullanıcıları alırsınız. O zaman 'SOL DIŞ JOIN' kullanmalısınız. – schlonzo

cevap

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

gitmesinin yolu olduğunu düşünüyorum. Bu yalnızca doğrudan ilişkili izinleri üretir ve dolaylı olarak ilgili izinleri profilden hariç tutar. – Gup3rSuR4c

+0

@ Gup3rSuR4c, sorgu değişti, şimdi plz chk –

+0

Ben 'DISTINCT' olmak için örnek rafine ve bana istediğim sonuçları verdi. Daha sonra bunu bir görüş haline getirdim ve EF uygulamasında “Kullanıcı” sınıfından sahte bir ilişki kurdum. Harika çalışıyor ve sorguları sadece bir LINQ uygulamasına karşı indirdim. Teşekkürler! – Gup3rSuR4c

0

Yani bu SQL deneyin LINQPad üzerinde karışıklık, ben bu geldi kadarıyla LINQ sorgu olarak:

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

Ve ne istiyorum üretir ANCAK öyle Bir grup SQL sorgusunun sonuçlarını oluşturarak. En büyük etki, Yönetici gibi, birden çok izin kümesine sahip profillerden gelir. Etrafında bir yol olduğunu düşünmüyorum ve sadece çalışmak için bir User nesnesine sahibim, bu yüzden en azından şimdilik SQL sorguları ile tamamım.

İlgili konular