繁体   English   中英

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

[英]LINQ many-to-many relationships: Solution?

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

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

所以我可以做的事情

artwork.artists.where(...)
//or
artist.Artworks.add(artwork)

但我不能这样做

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

替代文字http://img299.imageshack.us/img299/257/20090902122107.png

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

我在LINQ2SQL中使用M2M的方式:

  1. 将表拖到构建器中,就像您在问题中显示一样
  2. 除去artworks_subjectartwor k之间的关系
  3. 创建一个新的关系FROM artists_subject TO artwork
  4. 单击新关系以获取其属性
  5. 将基数从OneToMany更改为OneToOne(因为ManyToOne不存在)
  6. 打开“子属性”部分并更改“名称”字段以使其成为单数(Artworks to Artwork)

现在tagSubject实体将拥有artwork_subjects的集合,而artwork_subject将有类型的艺术品的属性称为艺术品 所以你现在可以制作一个LINQ表达式

var x = dbcontext.tagSubjects.Single(s=>s.name=="Landscape").
    Artwork_Subjects.
    Select(as=>as.Artwork.Name);

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

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

当然,如果你想在链接表中添加列,这就会变坏; 所以在某些方面我会试图“按原样”离开它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM