2010-10-14 71 views
0

现状:多对多多主键?

TableParent 2个primaryKeys,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; 

那么我认为这个工作到一个点,比方说,如果父母只有一个键,我是对吗?

我想我必须加入更多的第二组,但我目前输了。

回答

1

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

我不知道你试图解决什么问题,但它似乎是检索给定TableParent键的所有TableChild行。它应该是这样的:

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

如果你有你的表正确映射在你的LINQ到SQL设计,那么你就不必手动加入他们的行列 - 这是LINQ到SQL代码生成什么为你做。

例如,当你有一个TableConnector,你将能够检索TableChild行使用这样的事情

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

是的,我的意思是复合主键,因为有两列定义主键。正如我所说的,SQL不是我的强项。我要检查这个解决方案。我确定它的工作原理,但我也很好奇如何使用同样类型的查询来完成它,因为这可以帮助我处理SQL本身。 – 2010-10-14 11:26:36

+0

对不起,我没有真正进入'查询'语法,我觉得它非常不直观,我有点疲惫,准确地翻译它。但关键是你不必手动加入表格 - 这就是LINQ-to-SQL代码为你做的。 – 2010-10-14 11:35:37

+0

尝试你以前的解决方案我收到一个错误“类型参数不能从使用推断”。 SelectMany不会返回TableConnector对象而不是TableChild对象吗?只需要选择而不是selectMany就没有错误。也可以以某种方式包装在一个物体中?像旧的查询类型“select new wrapper(child);” – 2010-10-14 12:08:49

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 

如果你的理由父表中的多个按键是要建立父母之间的关系,这也需要加以解决通过父表中的关系字段(一对多)或其他关系表(多对多)

+0

我觉得TableParent表有其主键的两列它。 – 2010-10-14 11:02:55

+0

但该示例只使用一个来过滤查询(其中co.ParentKey1 == Parameter1) – SilverSkin 2010-10-14 11:08:23

+0

是的抱歉,我不清楚,但Kirk Broadhurst是正确的。父表的ahs 2 primaryKeys和我有两个参数。我只是不确定如何添加后面的一个。这就是为什么我标记参数1,因为也有参数2。 – 2010-10-14 11:22:01