Donné:
Une table nommée TABLE_1
avec les colonnes suivantes:
ID
ColumnA
ColumnB
ColumnC
J'ai requête SQL où les TABLE_1
jointures sur elle - même basée deux fois au large de ColumnA
, ColumnB
, ColumnC
. La requête peut ressembler à ceci:
Select t1.ID, t2.ID, t3.ID
From TABLE_1 t1
Left Join TABLE_1 t2 On
t1.ColumnA = t2.ColumnA
And t1.ColumnB = t2.ColumnB
And t1.ColumnC = t2.ColumnC
Left Join TABLE_1 t3 On
t2.ColumnA = t3.ColumnA
And t2.ColumnB = t3.ColumnB
And t2.ColumnC = t3.ColumnC
... and query continues on etc.
Problème:
J'ai besoin que cette requête soit réécrite dans LINQ. J'ai essayé de tenter le coup:
var query =
from t1 in myTABLE1List // List<TABLE_1>
join t2 in myTABLE1List
on t1.ColumnA equals t2.ColumnA
&& t1.ColumnB equals t2.ColumnA
// ... and at this point intellisense is making it very obvious
// I am doing something wrong :(
Comment écrire ma requête dans LINQ? Qu'est-ce que je fais mal?
join T2 in db.tbl2 on new { T1.firstName, T1.secondName } equals new { T2.colFirst, T2.colSecond }
. Si vous le changez, il compilera cependant,join T2 in db.tbl2 on new { N1 = T1.firstName, N2 = T1.secondName } equals new { N1 = T2.colFirst, N2 = T2.colSecond }
Dans LINQ2SQL, vous avez rarement besoin de rejoindre explicitement lorsque vous utilisez des jointures internes.
Si vous avez des relations de clé étrangère appropriées dans votre base de données, vous obtiendrez automatiquement une relation dans le concepteur LINQ (sinon vous pouvez créer une relation manuellement dans le concepteur, bien que vous devriez vraiment avoir des relations appropriées dans votre base de données)
Ensuite, vous pouvez simplement accéder aux tables associées avec la "notation par points"
va générer la requête
À mon avis, c'est beaucoup plus lisible et vous permet de vous concentrer sur vos conditions spéciales et non sur la mécanique réelle de la jointure.
Modifier
Ceci n'est bien sûr applicable que lorsque vous souhaitez rejoindre la ligne avec notre modèle de base de données. Si vous souhaitez rejoindre "en dehors du modèle", vous devez recourir à des jointures manuelles comme dans la réponse de Quintin Robinson
la source
Title_Authors est une recherche de deux choses qui se joignent à la fois aux résultats du projet et continuent à enchaîner
la source
Vous pouvez également utiliser:
la source
Je voudrais donner un autre exemple dans lequel plusieurs jointures (3) sont utilisées.
la source
Vous pouvez également rejoindre si le nombre de colonnes n'est pas le même dans les deux tables et peut mapper une valeur statique à la colonne de table
la source
À mon avis, c'est le moyen le plus simple de joindre deux tables avec plusieurs champs:
la source
Vous pouvez rédiger votre requête comme ceci.
Si vous souhaitez comparer votre colonne avec plusieurs colonnes.
la source