Получение объектов, чьи ключи соответствуют списку (или массиву) идентификаторов

Я использую 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.