LINQ多对多关系:解决方案?

时间:2009-09-02 09:33:01

标签: c# linq linq-to-sql many-to-many

LINQ到目前为止一直非常优雅,但是为了执行基本的m2m查询,它提供了我无法立即看到的解决方案。

更糟糕的是,虽然它适用于任何其他表关系,但LINQ并没有在我的m2m表的类结构中给我一个关联。

所以我可以做像

这样的事情
artwork.artists.where(...)
//or
artist.Artworks.add(artwork)

但我做不到

artwork.artowrks_subjects.tagSubjects.where(...)
//or
tagSubject.artworks_subjects.add(artwork)

alt text http://img299.imageshack.us/img299/257/20090902122107.png

是否有解决此限制的常见模式?

4 个答案:

答案 0 :(得分:5)

我在LINQ2SQL中使用M2M的方式:

  1. 将表拖到构建器中, 就像你在问题中展示一样
  2. 删除之间的关系 artwork_subject artwor k
  3. 创建一个新的关系FROM artwork_subject TO 艺术作品
  4. 点击新关系获取 其属性
  5. 改变了 从OneToMany到。的基数 OneToOne(因为ManyToOne没有 存在)
  6. 打开子属性 部分并将名称字段更改为 让它变得奇异(Artworks to 艺术品)
  7. 现在 tagSubject 实体将拥有 artwork_subjects 的集合, artwork_subject 将具有艺术品类型的属性名为艺术品。所以你现在可以制作像

    这样的LINQ表达式
    var x = dbcontext.tagSubjects.Single(s=>s.name=="Landscape").
        Artwork_Subjects.
        Select(as=>as.Artwork.Name);
    

答案 1 :(得分:3)

自己找到解决方案。要使自动关系起作用,两个表都需要主键(oops)。请注意artwork_subjects缺少PK符号。

答案 2 :(得分:2)

这在很大程度上取决于您使用的框架。它听起来就像你正在使用LINQ-to-SQL,它是关于表到对象的非常文字。使用Entity Framework,可以为多对多提供内置支持,特别是对于您列出的简单案例(没有其他属性的链接表)。 EF通常会发现这种模式,并将链接表隐藏在概念模型中(我不记得了,但它可能需要跨越两个FK列的跨越PK)。

当然,如果你想在链接表中添加列,这会变得很糟糕;所以在某些方面我会试图“按原样”保留它。

关于where等 - 你是什么意思?您可以对关联进行连接,并且您应该能够使用Any等;你有什么想做的具体例子吗?

答案 3 :(得分:-1)

是。而不是多对多使用两个多对一关系:

Subject -*----1- ArtworkSubjectParticipation -1----*- Artwork