Я почти уверен, что могу получить желаемые результаты из одного оператора Linq, я просто не могу найти его сам!Это то, что я имею до сих пор:
var query = from uir in Aspnet_UsersInRoles
join r in Aspnet_Roles
on uir.RoleId equals r.RoleId
select new
{
UserId = uir.UserId,
RoleName = r.RoleName
};
var query2 = from q in query
group q by q.UserId into roles
select new
{
UserId = roles.Key,
Roles = roles.Distinct()
};
var query3 = from u in Aspnet_Users
join q in query2
on u.UserId equals q.UserId
select new
{
UserId = u.UserId,
UserName = u.UserName,
Roles = q.Roles
};
Ожидаемые результаты:
, и это даже не правильно: мне на самом деле не нужно иметьUserId в списке 'Roles' / IEnumerable, просто список RoleName (ов) для каждого UserId.
Я использую таблицы sql членства asp.net и в основном хочу получить список пользователей, включая ихРоли.
- Каждый пользователь может иметь несколько ролей.
- Пользователи могут вообще не иметь никакой роли (и должны отображаться в результатах)
Не могли бы вы, пожалуйстапомогите мне или направьте меня в правильном направлении о том, как получить те же результаты из одного оператора Linq?
PS.Да, я новичок в Linq и ветеран SQL, который может скрывать мои мысли.
РЕДАКТИРОВАТЬ
Хорошо, я думаю, что добираюсь до этого:
var q = from u in Aspnet_Users
from up in UserProfiles.Where( _up => _up.UserId == u.UserId ).DefaultIfEmpty()
from uir in Aspnet_UsersInRoles.Where( _uir => _uir.UserId == u.UserId ).DefaultIfEmpty()
from r in Aspnet_Roles.Where( _r => _r.RoleId == uir.RoleId).DefaultIfEmpty()
group r.RoleName by new {
u.UserId,
u.UserName,
up.FirstName,
up.LastName,
u.LastActivityDate
} into g
select new
{
userID = g.Key.UserId,
firstName = g.Key.FirstName,
lastName = g.Key.LastName,
userName = g.Key.UserName,
lastActivityDate = g.Key.LastActivityDate,
roles = g.Distinct()
};
Что ты думаешь?(Я добавил информацию из своей таблицы UserProfiles, соотношение 1: 1 с Aspnet_Users)