У меня есть таблица Customers
с полем CustomerId
и таблица Publications
с полем PublicationId
. Наконец, у меня есть таблица сопоставления CustomersPublications
, в которой записывается, к каким публикациям может обратиться клиент - она имеет два поля: CustomerId
поле PublicationId
.
Для данного клиента я хочу обновить таблицу CustomersPublications
на основе списка идентификаторов публикации. Я хочу удалить записи в CustomersPublications
, где PublicationId
отсутствует в списке, и добавить новые записи, где PublicationId
есть в списке, но еще не в таблице.
Это было бы легко в SQL, но я не могу понять, как это сделать в Linq.
Для удаления части я попытался:
var recordsToDelete = dataContext.CustomersPublications.Where
(
cp => (cp.CustomerId == customerId)
&& ! publicationIds.Contains(cp.PublicationId)
);
dataContext.CustomersPublications.DeleteAllOnSubmit(recordsToDelete);
... но это не сработало. Я получил ошибку:
System.NotSupportedException: метод 'Boolean Contains (Int32)' не имеет поддерживаемого перевода в SQL
Итак, я попытался использовать Any()
следующим образом:
var recordsToDelete = dataContext.CustomersPublications.Where
(
cp => (cp.CustomerId == customerId)
&& ! publicationIds.Any(p => p == cp.PublicationId)
);
... и это дает мне еще одну ошибку:
System.NotSupportedException: локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains ()
Есть указатели?
[ Я должен сказать, я нахожу Линка сбивающим с толку (и расстраивающим) для всех, кроме самых простых запросов. Лучшее сообщение об ошибке поможет! ]