2010-10-04 4 views
2

j'ai tableaux suivantsrejoindre problème dans LINQ

T1  
    ==== ====== 
    ID  Desc 
    ==== ====== 
    1  t1 
    2  t2 
    3  t3 
    4  t4 


T2 
===== ======= ======== 
ID  T1ID  PT1ID 
===== ====== ========= 
1  2   1 
2  3   2 

En T2 et les deux T1ID PT1ID sont la clé étrangère pour T1. Dans ma sortie, je veux une ligne avec ID = 4 car il n'y a pas de ligne correspondante dans les deux colonnes de clé étrangère

+0

Voulez-vous dire que vous avez besoin d'une jointure externe? Ce serait utile si vous pouviez montrer votre code linq. –

+0

Je pense qu'il veut dire 'select * from T1 où n'existe pas (sélectionnez * de T2 où T2.T1ID = T1.ID) et n'existe pas (sélectionnez * de T2 où T2.PT1ID = T1.ID)' - sauf dans LINQ – Rup

Répondre

1

Cela devrait ne veux que vous voulez:

var notInT2 = T1.Where(i => T2.All(e => e.T1ID != i.Id) && 
          T2.All(e => e.PT1ID != i.Id)); 

Pour le tester:

class RowT1 { public Int32 Id;} 
class RowT2 { public Int32 T1ID; public Int32 PT1ID; } 

class Programm 
{ 
    static void Main() 
    { 
     var T1 = new List<RowT1>(){new RowT1(){Id=1}, 
            new RowT1(){Id=2}, 
            new RowT1(){Id=3}, 
            new RowT1(){Id=4}}; 

     var T2 = new List<RowT2>(){new RowT2(){T1ID=2, PT1ID=1}, 
            new RowT2(){T1ID=3, PT1ID=2}}; 

     var notInT2 = T1.Where(i => T2.All(e => e.T1ID != i.Id) && 
            T2.All(e => e.PT1ID != i.Id)); 

     Console.ReadLine(); 
    } 
} 
+0

Cela fonctionne comme un charme merci – Tassadaque

1

Je ne suis pas sûr à 100% de ce que vous essayez de faire.

Je suppose que vous voulez renvoyer toutes les lignes de T1 et toutes les lignes correspondantes de T2 où les valeurs de colonne T1ID ou PT1ID sont égales à la colonne T1 ID.

Si c'est le cas, vous avez besoin d'une jointure externe. Vous pouvez obtenir un bon exemple de jointures externes de la MSDN microsoft Forums