Получение сущностей, чьи ключи соответствуют списку (или массиву) идентификаторов - PullRequest
10 голосов
/ 10 августа 2011

Я использую CodeFirst EntityFramework. У меня есть IQueryable<User> сущности, которые возвращаются с помощью context.Users; где контекст - это DbContext EntityFramework. Из этого списка я должен выбрать тех, чей Id содержится в массиве Ids (long). Идентификатор является первичным ключом сущности пользователя. Я пробовал следующее, но получаю ошибку компилятора.

IQueryable<User> users = GetQueryableUsers(); 
long [] ids = GetSelectedIds(); //array of long representing Ids key of User entities
users.Intersect(ids); // compilation error
users.Where(user => ids.Contains(user.Id)); //compilation error

Ошибка компиляции (определение для Intersect / Contains не найдено) Примечание. System.Linq уже импортирован.

Ответы [ 2 ]

15 голосов
/ 10 августа 2011

Убедитесь, что вы ссылаетесь на System.Linq

например. using System.Linq

Тогда user.Id должен иметь тип long. Вы заявили в комментариях, что это долго? потому что вы полагали, что именно так вам нужно было использовать первичный ключ. Решение состоит в том, чтобы использовать long и использовать параметры идентификатора автогенерации структуры сущностей.

В качестве альтернативы, более общий случай, когда не первичные ключи могут иметь значение NULL, будет использовать опцию contains с оператором value или default.

users.Where(user=>ids.Contains(user.id??0));
0 голосов
/ 10 августа 2011

Ваша проблема в том, что вы не можете пересекать пользователей с длинными идентификаторами. Пересечение может использоваться только в IEnumerables того же типа.

Вы должны использовать user.Id.GetValueOrDefault(), потому что ваш идентификатор long? вместо long.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...