簡體   English   中英

Asp.Net Identity 查找不在角色中的用戶

[英]Asp.Net Identity find users not in role

我需要使用 Asp.Net Identity 找到所有不包含某個角色的用戶。
到目前為止,我有類似的東西,但它不起作用。

(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”的用戶。
看起來我需要某種類型的 not in sub 查詢?

這是有效的 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()

在 c# 中,您可以獲取所有不屬於特定角色的用戶,如下所示:

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

用戶實體框架的加入

ApplicationRole superAdminRole = await _context.Roles.FirstOrDefaultAsync(x => x.Name == "SuperAdmin");

IEnumerable<ApplicationUser> users =await _context.UserRoles.Join(_context.Users, x => x.UserId, y => y.Id, (x, y) => new
{
    User = y,
    RoleId = x.RoleId
}).Where(x => x.RoleId != superAdminRole.Id)
  .Select(x => x.User)
  .ToListAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM