Linq to sql 在Linq中更新映射表

Linq to sql 在Linq中更新映射表,linq-to-sql,Linq To Sql,我有一个带有CustomerId字段的Customers表,还有一个带有PublicationId字段的Publications表。最后,我有一个映射表CustomersPublications,它记录了客户可以访问的出版物-它有两个字段:CustomerId字段PublicationId 对于给定的客户,我想根据出版物ID列表更新CustomersPublications表。我想删除CustomersPublications中PublicationId不在列表中的记录,并添加Publicati

我有一个带有
CustomerId
字段的
Customers
表,还有一个带有
PublicationId
字段的
Publications
表。最后,我有一个映射表
CustomersPublications
,它记录了客户可以访问的出版物-它有两个字段:
CustomerId
字段
PublicationId

对于给定的客户,我想根据出版物ID列表更新
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到SQL实现中不能使用本地序列,但Contains()运算符除外

有什么指示吗?


[我不得不说,除了最简单的查询外,我觉得Linq让人困惑(而且令人沮丧)。更好的错误消息会有所帮助!]

哇。几乎是偶然的,我发现在我的第一个示例中不能使用
Contains
的原因是我的
publicationIds
IList
而不是
int[]
。我改变了它,它成功了


谢谢,编译器消息作者!:-|

哇。几乎是偶然的,我发现在我的第一个示例中不能使用
Contains
的原因是我的
publicationIds
IList
而不是
int[]
。我改变了它,它成功了


谢谢,编译器消息作者!:-|

LINQtoSQL对于查询数据库来说是非常棒的,但是对于更新来说并不是很好,因为它必须选择所有要修改的行,然后逐个更新每个对象。如果您可以使用ExecuteQuery在纯SQL中执行此操作,它将运行得更快。LINQ to SQL对于查询数据库来说非常棒,但对于更新来说并不太好,因为它必须选择要修改的所有行,然后逐个更新每个对象。如果您可以使用ExecuteQuery在纯SQL中执行,它将运行得更快。