2015-06-15 146 views
4

我需要使用Asp.Net Identity找到不含有某個角色的所有用戶。
到目前爲止,我有這樣的事情,但它不工作。Asp.Net標識查找不在角色中的用戶

(From role In context.Roles 
From userRoles In role.Users 
Join us In context.Users On us.Id Equals userRoles.UserId 
Where role.Name <> "SomeRole" 
Select us.UserName) 

這給我一個所有用戶的列表,但它包括角色「SomeRole」中的用戶。
它看起來我需要一些不在子查詢中的類型?

這是可以工作的SQL代碼,但如果可能的話,我仍然會喜歡LINQ查詢。

select distinct A.UserName from AspNetUsers A 
inner join AspNetUserRoles UR on UR.UserId = A.Id 
inner join AspNetRoles R on R.Id = UR.RoleId 
where not exists(
    select AspNetUserRoles UR1 on UR1.UserId = A.Id 
    inner join AspNetRoles R1 on R1.Id = UR1.RoleId 
    where R1.Name = 'SomeRole') 

那麼我有一個工作解決方案,但它並不漂亮,我相信它可以寫得更好。

(From role In context.Roles 
From userRole In role.Users 
Join user In context.Users On us.Id Equals userRole.UserId 
Where Not (
    From role1 In context.Roles 
    From userRole1 In role1.Users 
    Join user1 In context.Users On user1.Id Equals userRoles1.UserId 
    Where role1.Name = "SomeRole" 
    Select user1.Id).Contains(user.Id) 
Select user.UserName).Distinct() 
+0

對不起上面的代碼是在VB,但在C#是=我沒有標記的文章!作爲VB或C#。 – goroth

回答

8

在C#中,你可以得到不在這樣的特定角色的所有用戶:

var role = context.Roles.SingleOrDefault(m => m.Name == "role"); 
var usersNotInRole = context.Users.Where(m => m.Roles.All(r => r.RoleId != role.Id)); 
+0

這不起作用,因爲Asp.Net Identity直接沒有「角色」類。要獲得「角色」類,它將關閉contextRoles.Users。這是我卡住的地方。 – goroth

+0

@goroth您可以延遲加載來自用戶的角色,但默認名稱是「IdentityRole」。更新的答案。 – tmg

+0

用戶沒有「IdentityRole」。這是令人困惑的地方,因爲我有一個繼承IdentityRole的ApplicationRole類,但LINQ不會直接查詢ApplicationRole類。 – goroth