Ограничений на присоединение нет, но, к сожалению, все еще есть много недостатков / ошибок / проблем в переводе запросов EF Core некоторых конструкций LINQ.
Обычно вам не нужно Include
/ ThenInclude
в проекционные (Select
) запросы, потому что они игнорируются. Но получение NRE без них здесь указывает на попытку оценки клиента (EF Core 3.x все еще поддерживает оценку клиента для некоторых конструкций, и в основном в окончательной проекции, как здесь), что, в свою очередь, означает неудачный перевод.
Здесь Кажется, проблема в
x.TblInternalUserRoles.FirstOrDefault().Role.TblInternalRoleRights.Select(i => i.RightId)
, т. е. преобразовании последовательности (x.TblInternalUserRoles
) в один элемент (.FirstOrDefault()
) и последующем получении подпоследовательности (.Role.TblInternalRoleRights
).
Рабочим решением является используйте оператор SelectMany
для выравнивания исходной последовательности. FirstOrDefault()
должен быть удален (для меня это не имеет смысла) или, если действительно необходимо, заменен соответствующим оператором эквивалентной последовательности Take(1)
.
например
RightIds = x.TblInternalUserRoles
.SelectMany(ur => ur.Role.TblInternalRoleRights.Select(i => i.RightId))
.ToList()
или
RightIds = x.TblInternalUserRoles
.SelectMany(ur => ur.Role.TblInternalRoleRights, (ur, i) => i.RightId)
.ToList()
или
RightIds = x.TblInternalUserRoles
.SelectMany(ur => ur.Role.TblInternalRoleRights)
.Select(i => i.RightId)
.ToList()