【问题标题】:Update mapping table in Linq更新 Linq 中的映射表
【发布时间】:2010-03-28 21:07:27
【问题描述】:

我有一个表 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:本地序列不能用于查询运算符的 LINQ to SQL 实现中,但 Contains() 运算符除外

有什么建议吗?

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

【问题讨论】:

  • LINQ to SQL 非常适合查询数据库,但它对于更新来说并不是那么好,因为它必须选择您要修改的所有行,然后一个接一个地更新每个对象.如果您可以使用 ExecuteQuery 在纯 SQL 中执行此操作,它将运行得更快。

标签: linq-to-sql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多