Получить список элементов по их идентификатору в структуре сущностей

Как я могу получить все элементы, которые находятся в другом списке по ID? Например, У меня есть роли List; Я хотел бы получить все роли из базы данных, которые находятся в этом списке по их идентификатору.

Я использую только код.

Я сделал это, и он сделал ошибку:

var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId));

RoleId имеет тип int.

Ошибка:

Невозможно создать постоянное значение типа "SampleMVC.Domain.Role". В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Ответы

Ответ 1

var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));

Ответ 2

Что-то вроде этого должно работать, если user.Roles - это список ints:

var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId));

Это превращает его в "SELECT WHERE IN (x, y, z...)" в SQL.

Ответ 3

Вы не можете объединить локальный список с удаленными данными, тогда для db нет ничего для чтения, поскольку данные являются более точными (на вашем клиенте).

Я думаю, что может быть лучшее решение того, что вы пытаетесь сделать,

Кажется, вы пытаетесь получить все роли, назначенные конкретному пользователю. Если в этом случае я предлагаю решение, в котором вы передаете текущий идентификатор пользователя в базу данных и извлекаете роли, назначенные с помощью INNER JOIN.

В зависимости от вашей базы данных это может выглядеть примерно так (если вы подключаете пользователей к ролям через таблицу под названием UserRoles)

var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role)

(Конечно, вы также можете создать хранимую процедуру, возвращая список "Роль", если вам нравится прямо в вашем db и набросайте его.)