Я не могу сказать наверняка, не глядя на ваши данные, но я ожидаю, что ваш запрос вернет вам гораздо больше ролей, чем вы ищете.
Вот псевдокод для существующего запроса:
Get all roles
From those roles, accept only those where these are true:
Any mapping exists that matches the user ID
Any mapping exists that matches the role ID
Проблема в том, что вы не гарантируете, что эти пункты Any
сводятся к одному и тому же отображению.У пользователя не должно быть этой конкретной роли - у пользователя просто должна быть какая-то роль, и роль должна быть сопоставлена с каким-либо пользователем.
Вот что вы действительно хотите, чтобы ваш запрос выполнял:
Get all roles
From those roles, accept only those where this is true:
Any mapping exists that matches *both* the user ID and the role ID
Для реализации этого запроса:
var roles = (from r in context.Roles
where context.UserHasRole.Any(uhr => uhr.UserId == userId
&& uhr.RoleId == r.Id)
select r)
.ToList();