更新Linq中的映射表

时间:2010-03-28 21:07:27

标签: linq-to-sql

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

对于给定的客户,我想根据发布ID列表更新CustomersPublications表。我想删除CustomersPublicationsPublicationId不在列表中的记录,并添加新记录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:除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现

任何指针?

[我不得不说,除了最简单的查询之外,我发现Linq莫名其妙(并且令人沮丧)。更好的错误消息会有所帮助!]

1 个答案:

答案 0 :(得分:1)

哇。几乎是偶然的,我发现在我的第一个例子中我无法使用Contains的原因是我的publicationIdsIList<int>而不是int[]。我改变了它,它起作用了。

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