我有一个表Customers
带有CustomerId
字段,而Publications
表带有PublicationId
字段。最后,我有一个映射表CustomersPublications
,记录客户可以访问哪些发布 - 它有两个字段:CustomerId
字段PublicationId
。Linq中的更新映射表
对于给定客户,我想根据发布标识列表更新CustomersPublications
表。我想删除其中PublicationId
不在列表中的CustomersPublications
中的记录,并添加新的记录,其中PublicationId
位于列表中但尚未在列表中。
这在SQL中很容易,但我无法弄清楚如何在Linq中完成它。
对于删除的部分,我想:
var recordsToDelete = dataContext.CustomersPublications.Where
(
cp => (cp.CustomerId == customerId)
&& ! publicationIds.Contains(cp.PublicationId)
);
dataContext.CustomersPublications.DeleteAllOnSubmit(recordsToDelete);
...但没有奏效。我得到了一个错误:
System.NotSupportedException: Method 'Boolean Contains(Int32)' has no supported translation to SQL
所以,我尝试使用Any()
,如下:
var recordsToDelete = dataContext.CustomersPublications.Where
(
cp => (cp.CustomerId == customerId)
&& ! publicationIds.Any(p => p == cp.PublicationId)
);
...这只是给了我另一个错误:
System.NotSupportedException: Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator
任何指针?
[我不得不说,我发现Linq对除最简单的查询以外的所有问题都感到莫名其妙(令人沮丧)。更好的错误信息会有所帮助]
LINQ to SQL对查询数据库非常有用,但它对于更新并不是很好,因为它必须选择要修改的所有行,然后逐个更新每个对象。如果您可以使用ExecuteQuery在纯SQL中执行,它将运行得更快。 – 2010-03-28 21:13:09