Ответ 1
var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
Как я могу получить все элементы, которые находятся в другом списке по ID? Например, У меня есть роли List; Я хотел бы получить все роли из базы данных, которые находятся в этом списке по их идентификатору.
Я использую только код.
Я сделал это, и он сделал ошибку:
var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId));
RoleId
имеет тип int.
Ошибка:
Невозможно создать постоянное значение типа "SampleMVC.Domain.Role". В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).
var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
Что-то вроде этого должно работать, если user.Roles - это список ints:
var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId));
Это превращает его в "SELECT WHERE IN (x, y, z...)" в SQL.
Вы не можете объединить локальный список с удаленными данными, тогда для db нет ничего для чтения, поскольку данные являются более точными (на вашем клиенте).
Я думаю, что может быть лучшее решение того, что вы пытаетесь сделать,
Кажется, вы пытаетесь получить все роли, назначенные конкретному пользователю. Если в этом случае я предлагаю решение, в котором вы передаете текущий идентификатор пользователя в базу данных и извлекаете роли, назначенные с помощью INNER JOIN.
В зависимости от вашей базы данных это может выглядеть примерно так (если вы подключаете пользователей к ролям через таблицу под названием UserRoles)
var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role)
(Конечно, вы также можете создать хранимую процедуру, возвращая список "Роль", если вам нравится прямо в вашем db и набросайте его.)