Получение объектов, чьи ключи соответствуют списку (или массиву) идентификаторов
Я использую CodeFirst EntityFramework. У меня есть объекты IQueryable<User>
, которые возвращаются с использованием context.Users; где контекст - это DbContext для EntityFramework. Из этого списка я должен выбрать те, Id которых содержится в массиве идентификаторов (длинный). Идентификатор является первичным ключом пользователя. Я пробовал следующее, но получаю ошибку компилятора.
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 уже импортирован.
Ответы
Ответ 1
Убедитесь, что вы ссылаетесь на System.Linq
например. using System.Linq
Тогда user.Id должен иметь тип long. Вы заявили в комментариях, что это долго? потому что вы полагали, что именно так вам нужно использовать первичный ключ. Решение состоит в том, чтобы использовать long и использовать опции autogenerate id структуры сущности.
В качестве альтернативы более общий случай для не первичных ключей, который может быть пустым, заключается в использовании опции contains со значением или оператором по умолчанию.
users.Where(user=>ids.Contains(user.id??0));
Ответ 2
Ваша проблема заключается в том, что вы не можете пересекать пользователей с длинными идентификаторами. Пересечение можно использовать только в IEnumerables того же типа.
Вы должны использовать user.Id.GetValueOrDefault()
, потому что ваш идентификатор long?
вместо long
.