2010-03-28 34 views
1

我有一个表Customers带有CustomerId字段,而Publications表带有PublicationId字段。最后,我有一个映射表CustomersPublications,记录客户可以访问哪些发布 - 它有两个字段:CustomerId字段PublicationIdLinq中的更新映射表

对于给定客户,我想根据发布标识列表更新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对除最简单的查询以外的所有问题都感到莫名其妙(令人沮丧)。更好的错误信息会有所帮助]

+0

LINQ to SQL对查询数据库非常有用,但它对于更新并不是很好,因为它必须选择要修改的所有行,然后逐个更新每个对象。如果您可以使用ExecuteQuery在纯SQL中执行,它将运行得更快。 – 2010-03-28 21:13:09

回答

1

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

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