2010-10-14 9 views
0

Situation:Beaucoup à plusieurs avec plusieurs clés primaires?

TableParent avec 2 primaryKeys, ParentKey1 et ParentKey2 TableChild avec 1 primaryKey, ChildKey TableConnector avec des colonnes ParentKey1, ParentKey2 et ChildKey

C'est là, je pense que je devrais aller avec ma requête Linq. Notez que je récupère tous les enfants appartenant à un parent, donc j'ai ses clés comme paramètres.

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; 

Eh bien, je tthink cela fonctionne jusqu'à un certain point, disons que si le parent avait qu'une seule clé, suis-je raison?

Je suppose que je dois rejoindre un peu plus dans un deuxième groupe mais je suis actuellement perdu.

Répondre

1

Tout d'abord, vous n'avez pas deux clés primaires sur votre table. Vous ne pouvez avoir qu'une seule clé primaire (d'où le nom primaire). Il semble que vous ayez une clé primaire composite, ce qui signifie une clé composée de plusieurs colonnes.

Je ne suis pas sûr du problème que vous essayez de résoudre, mais il semble récupérer toutes les lignes TableChild pour une clé TableParent donnée. Il devrait être quelque chose comme ceci:

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

Si vous avez vos tables mises en correspondance correctement sur votre concepteur LINQ-to-Sql alors vous n'avez pas à les joindre à la main - c'est ce que le code LINQ to Sql génération fait pour vous.

Par exemple, lorsque vous avez un TableConnector vous pourrez récupérer les TableChild lignes pour l'aide quelque chose comme ça

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

Oui, je voulais dire clé primaire composite car il y a deux colonnes définissant la clé primaire. Comme je l'ai mentionné, SQL n'est pas mon fort. Je vais vérifier cette solution. Je suis sûr que cela fonctionne mais je suis également curieux de savoir comment le faire avec le même type de requête que je le fais car cela pourrait m'aider avec le SQL lui-même. –

+0

Désolé je ne suis pas vraiment dans la syntaxe 'query', je trouve cela très peu intuitif et je suis un peu fatigué de le traduire avec précision. Mais le point crucial est que vous n'avez pas à joindre manuellement les tables - c'est ce que fait le code LINQ-to-SQL pour vous. –

+0

Essayer votre ancienne solution J'ai une erreur "L'argument type ne peut pas être déduit de l'utilisation". Le SelectMany ne retourne-t-il pas les objets TableConnector au lieu des objets TableChild? Juste prendre des sélections au lieu de selectMany est sans erreur. Aussi, puis-je envelopper dans un objet en quelque sorte? comme ancien type de requête "sélectionnez un nouveau wrapper (enfant);" –

1

tableParent ne nécessite qu'une seule clé primaire (de son propre Id) et tableChild a besoin d'un (il est Id) le connectorTable n'a besoin que deux colonnes pour faire fonctionner un grand nombre à plusieurs-relation: ParentId et ChildID

pour chaque relation entre un parent et un enfant vous suffit d'ajouter une ligne à la connectorTable, et afin de récupérer les résultats, essayez ceci:

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

Si votre raison de plusieurs clés dans la table parent est que vous voulez créer des relations entre les parents aussi bien cela doit être abordé soit via un champ de relation dans la table parente (un-à-plusieurs) ou une autre relationTable (plusieurs-à-plusieurs)

+0

Je pense que la table TableParent a deux colonnes dans sa clé primaire. –

+0

mais l'exemple utilise seulement un pour filtrer la requête (où co.ParentKey1 == Parameter1) – SilverSkin

+0

Ouais désolé je n'étais pas clair mais Kirk Broadhurst a raison. Le parentTable ahs 2 primaryKeys et j'ai les deux paramètres. Je ne savais pas comment ajouter le dernier. C'est pourquoi j'ai marqué le paramètre 1 car il y a aussi le paramètre 2. –

Questions connexes