我的表格Customers
包含CustomerId
字段,表格Publications
包含PublicationId
字段。最后,我有一个映射表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:除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现
任何指针?
[我不得不说,除了最简单的查询之外,我发现Linq莫名其妙(并且令人沮丧)。更好的错误消息会有所帮助!]
答案 0 :(得分:1)
哇。几乎是偶然的,我发现在我的第一个例子中我无法使用Contains
的原因是我的publicationIds
是IList<int>
而不是int[]
。我改变了它,它起作用了。
谢谢,编译消息作者! : - |