В чем проблема с моим кодом?
Технически проблема не в вашем коде, который является допустимым запросом LINQ, а в ошибках / недостатках транслятора запросов EF Core.
Здесь есть две конструкции
AccessLevel = x.UserRoles.FirstOrDefault().Role.AccessLevels.ToList()
, которые вызывают проблемы с переводчиком EF Core.
Первый вызов ToList()
. Хотя он поддерживается в окончательных проекциях (Select
), он вызывает проблемы с другими операторами запросов, такими как следующая Select
часть
v.AccessLevel.Select(x=>x.Access)
Секунда FirstOrDefault()
здесь
x.UserRoles.FirstOrDefault().Role.AccessLevels
т. е. преобразование последовательности в один элемент, затем извлечение из нее дочерней последовательности.
как я могу решить эту проблему?
Сначала удалите ToList()
или устраните средний Select
. Во-вторых, удалите FirstOrDefault()
- бессмысленно или, если действительно необходимо, замените его оператором ограничения эквивалентного набора Take(1)
. Используйте оператор выравнивания набора SelectMany
, чтобы перейти к нужному подмножеству.
Например,
AccessLevel = x.UserRoles.SelectMany(ur => ur.Role.AccessLevels)
должно решить текущую проблему.
Не связано, но поскольку в вашей модели у пользователя много ролей, а у роли много уровней доступа, здесь
AccessUnserInfos = v.AccessLevel.Select(x => x.Access)
вы можете получить повторяющиеся значения, поэтому рассмотрите возможность применения оператора Distinct
AccessUnserInfos = v.AccessLevel.Select(x => x.Access).Distinct()