2015-06-15 4 views
4

Мне нужно найти всех пользователей, которые DONT'T содержат определенную роль, используя Asp.Net Identity.
До сих пор у меня есть что-то вроде этого, но оно не работает.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».
Похоже, мне нужен какой-то тип не в подзапросе?

Вот код 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 нет класса «Роль». Чтобы перейти к классу «Роль», он отключен от контекста. Вот где я застрял. – goroth

+0

@goroth вы можете ленить нагрузки Роли от Пользователей, но имя по умолчанию - «IdentityRole». обновленный ответ. – tmg

+0

нет «IdentityRole» у Пользователей. Вот где он запутывается, потому что у меня есть класс ApplicationRole, который унаследовал IdentityRole, но LINQ не будет запрашивать класс ApplicationRole напрямую. – goroth

Смежные вопросы