情况:
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;
嗯,我认为这可以达到一定程度,让我们说如果父母只有一把钥匙,我是对的吗?
我想我必须加入更多的第二组,但我现在迷路了。
答案 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();