有多个主键的多对多?

时间:2010-10-14 10:49:17

标签: sql linq-to-sql join

情况:

TableParent,包含2个primaryKey,ParentKey1和ParentKey2 TableChild有1个primaryKey,ChildKey TableConnector,包含ParentKey1,ParentKey2和ChildKey

这是我认为应该使用Linq查询的地方。请注意,我正在获取属于父项的所有子项,因此我将其键作为参数。

var query = from conn in db.TableConnector
            join child in db.TableChild on conn.ChildKey equals child.childKey
            join par in db.TableParent on conn.ParentKey1 equals par.parentkey1 into connGroup
            from co in connGroup
            where co.ParentKey1 == Parameter1
            Select child;

嗯,我认为这可以达到一定程度,让我们说如果父母只有一把钥匙,我是对的吗?

我想我必须加入更多的第二组,但我现在迷路了。

2 个答案:

答案 0 :(得分:1)

tableParent只需要一个主键(它自己的Id),tableChild需要一个(它是Id) connectorTable只需要两列来实现多对多关系: ParentId和ChildId

对于父母和孩子之间的每个关系,您只需在connectorTable中添加一行,并且为了检索结果,请尝试:

select * from tableParent
inner join connectorTable
on tableParent.Id = connectorTable.ParentId
inner join tableChild
on connectorTable.ChildId = tableChild.Id

如果你在父表中有多个键的原因是你想要在父表之间创建关系,那么需要通过父表中的关系字段(一对多)或另一个关系表来解决这个问题。一对多)

答案 1 :(得分:1)

首先,您的桌面上没有两个主键。您只能拥有一个主键(因此名称为primary)。听起来你有一个复合主键,这意味着一个由多个列组成的键。

我不确定您要解决的问题是什么,但似乎是检索给定TableParent键的所有TableChild行。它应该是这样的:

db.TableParent
    .Single(parent => parent.ParentKey1 == key1 && parent.ParentKey2 == key2)
    .TableConnectors.Select(connector => connector.TableChild)

如果您的表在Linq-to-Sql设计器上正确映射,那么您不必手动加入它们 - 这就是Linq-to-Sql代码生成为您所做的。

例如,如果您有TableConnector,则可以使用此类内容检索TableChild

TableConnector t = db.TableConnectors.First();
List<TableChilds> tableChilds = tableConnector.TableChilds.ToList();