Обновление таблицы сопоставления в Linq - PullRequest
1 голос
/ 29 марта 2010

У меня есть таблица 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 ()

Есть указатели?

[ Я должен сказать, я нахожу Линка сбивающим с толку (и расстраивающим) для всех, кроме самых простых запросов. Лучшее сообщение об ошибке поможет! ]

1 Ответ

1 голос
/ 29 марта 2010

Ничего себе. Почти случайно я обнаружил, что причина, по которой я не мог использовать Contains в своем первом примере, заключалась в том, что мой publicationIds был IList<int>, а не int[]. Я изменил это, и это сработало.

Спасибо, автор сообщения компилятора! : - |

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