Получить список элементов по их идентификатору в рамках сущности - PullRequest
23 голосов
/ 11 апреля 2011

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

Я использую код вначале.

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

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

RoleId имеет тип int.

Ошибка:

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

Ответы [ 3 ]

62 голосов
/ 11 апреля 2011
var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
11 голосов
/ 11 апреля 2011

Примерно так должно работать, если user.Roles - это список целых чисел:

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

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

1 голос
/ 11 апреля 2011

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

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

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

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

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

(Конечно, вы можете также создать хранимую процедуру, возвращающую список «Role», если вам нравится непосредственно в вашей БД, и отобразить ее.)

...