Как использовать общие коллекции вместе с LINQ-to-entity - PullRequest
0 голосов
/ 29 апреля 2009

У меня проблемы с преобразованием следующего оператора 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? Я просто хочу выбрать группу сущностей из БД, за исключением сущностей, присутствующих в локальной (не БД) коллекции.

1 Ответ

2 голосов
/ 29 апреля 2009

Попробуйте этот пост: Предложение "NOT IN" в LINQ to Entities

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