Как написать внешнее соединение EF Core, которое возвращает объекты, содержащие подмассивы? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь выполнить левое внешнее соединение в Linq с Sql, чтобы включить все роли для данного пользователя:

from au
    in Db.AspNetApplicationUsers
where au.ApplicationId == applicationId
join u in Db.AspNetUsers 
    on au.UserId equals u.Id
join r in Db.AspNetUserRoles 
    on au.UserId equals r.UserId 
    into ur
from userRole in ur.DefaultIfEmpty()
select new UserSummary
{
    Active = au.Active,
    Email = u.NormalizedEmail,
    Name = u.FullName,
    Id = u.Id,
    LastLogin = u.LastLogin,
    LastPasswordChange = u.PasswordLastChanged,
    LockedOut = u.LockoutEnabled,
    Roles = (from x in ur where userRole.RoleId != null select userRole.RoleId).ToArray()
}

, но получаю следующую ошибку:

System.InvalidOperationException: 'When called from 'VisitLambda', rewriting a node of type 'System.Linq.Expressions.ParameterExpression' must return a non-null value of the same type. Alternatively, override 'VisitLambda' and change it to not visit children of this type.'

Я не часто использую внешние соединения в EF, поэтому уверен, что просто испортил синтаксис.

Можно ли вернуть массив в свойство в Linq на SQL ?

Если я добавлю условие where userRole.RoleId != null после from userRole in ur.DefaultIfEmpty(), код больше не будет сбой, но произойдет во время сериализации. Я отключил ленивую загрузку, так что это интересно.

1 Ответ

1 голос
/ 05 августа 2020

Согласно предложению Камило Теревинто, следующее работало нормально:

from au
    in Db.AspNetApplicationUsers
where au.ApplicationId == applicationId
select new UserSummary
{
    Active = au.Active,
    Email = au.User.NormalizedEmail,
    Name = au.User.FullName,
    Id = au.User.Id,
    LastLogin = au.User.LastLogin,
    LastPasswordChange = au.User.PasswordLastChanged,
    LockedOut = au.User.LockoutEnabled,
    Roles = au.User.AspNetUserRoles.Where(r => r.RoleId != null).Select(r => r.RoleId).ToArray()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...