Я пытаюсь выполнить левое внешнее соединение в 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()
, код больше не будет сбой, но произойдет во время сериализации. Я отключил ленивую загрузку, так что это интересно.