【发布时间】:2010-03-28 21:07:27
【问题描述】:
我有一个表 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:本地序列不能用于查询运算符的 LINQ to SQL 实现中,但 Contains() 运算符除外
有什么建议吗?
[我不得不说,除了最简单的查询之外,我发现 Linq 令人困惑(并且令人沮丧)。更好的错误消息会有所帮助!]
【问题讨论】:
-
LINQ to SQL 非常适合查询数据库,但它对于更新来说并不是那么好,因为它必须选择您要修改的所有行,然后一个接一个地更新每个对象.如果您可以使用 ExecuteQuery 在纯 SQL 中执行此操作,它将运行得更快。
标签: linq-to-sql