代码之家  ›  专栏  ›  技术社区  ›  Gary McGill

更新LINQ中的映射表

  •  1
  • Gary McGill  · 技术社区  · 14 年前

    我有张桌子 Customers 用一个 CustomerId 字段和表 Publications 用一个 PublicationId 字段。最后,我有一个映射表 CustomersPublications 记录客户可以访问的出版物-它有两个字段: 客户ID 领域 公开ID .

    对于给定的客户,我要更新 客户出版物 基于发布ID列表的表。我想删除中的记录 客户出版物 在哪里 公开ID 不在列表中,并将新记录添加到 公开ID 在列表中,但尚未在表中。

    这在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实现中不能使用本地序列,但包含()运算符除外。

    有什么建议吗?

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Gary McGill    14 年前

    真的。几乎是偶然的,我发现我不能使用的原因 Contains 我的第一个例子是 publicationIds 是一个 IList<int> 而不是一个 int[] . 我改变了它,它起作用了。

    谢谢,编译器消息作者!- -