У меня проблемы с преобразованием следующего оператора SQL в LINQ-to-entity:
SELECT l.*
FROM locations l
WHERE l.id NOT IN (/* array of ids */)
В LINQ я хотел бы видеть что-то вроде (где myCollection - это общий список исключаемых элементов):
IQueryable<Location> locationQuery = from l in DataContext.Location
where !myCollection.Contains(l)
select l;
Но это не сработает, потому что Contains недоступен в LINQ-to-entity (как я вижу). В моей лучшей / ближайшей попытке LINQ у меня есть моя коллекция Locations (список), и у меня есть DataContext, который извлекает все существующие Locations из базы данных:
List<Location> Route = new List<Location>();
// Some code to add Location entities from the DB to the Route collection
var innerQuery = from p in Route
select p.ID;
IQueryable<Location> locationQuery = from l in DataContext.Location
where !((innerQuery).Any(k => k == l.ID))
select l;
Очевидно, я хочу получить все локации из БД, которых нет в моей локальной коллекции. Однако код вызовет исключение NotSupportedException, сообщающее:
Невозможно создать постоянное значение типа 'Тип закрытия'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).
Я возился с этим, используя разные подходы, но я просто не могу заставить его работать. Теперь я прочитал, что LINQ-to-entity не способен к высокоуровневым сравнениям (уровень объекта), которые могут объяснить ошибку выше.
Мой реальный вопрос: как мне сделать в LINQ то, что я могу легко сделать в SQL? Я просто хочу выбрать группу сущностей из БД, за исключением сущностей, присутствующих в локальной (не БД) коллекции.