Ошибка получения Linq Expression при получении значений Enum. Я следовал разным трюкам Google, но не помог. Я новичок в Ef Core - PullRequest
1 голос
/ 06 мая 2020

Получение ошибки выражения Linq при получении значений Enum. Я следовал разным трюкам Google, но не помог. Я новичок в Ef Core, я возвращаю Enum Type userRoles в роли var этой строкой, но я получил null. var role = await _context.Roles.Where (r => userRoles.Any (ur => ur.ToString () == r.Name)). ToListAsyn c ();

System.InvalidOperationException: Выражение LINQ «DbSet .Where (r => __userRoles_0 .Any (ur => ur.ToString () == r.Name))» не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().

1 Ответ

1 голос
/ 06 мая 2020

Насколько я понимаю, переменная userRoles содержит некоторую коллекцию в памяти (например, List, массив et c.), Содержащую некоторые настраиваемые Enum значения, которые вы хотите использовать в качестве фильтра для объекта, имеющего string свойство.

EF Core имеет очень ограниченную поддержку коллекций в памяти внутри запроса LINQ to Entities. В основном коллекции примитивных типов и Enumerable.Contains.

Итак, что вы можете сделать в этом конкретном случае c, так это преобразовать пользовательскую коллекцию Enum значений в коллекцию строк, содержащую желаемые имена вне запроса EF Core (1), а затем используйте его с оператором Contains внутри (2):

var userRoleNames = userRoles.Select(ur => ur.ToString()); // (1)
var roles = await _context.Roles
    .Where(r => userRoleNames.Contains(r.Name)) // (2)
    .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...