2012-12-17 5 views
2

J'ai deux DataTables t1 et t2. J'essaie d'effectuer une jointure LINQ gauche, multiple equijoin, pour obtenir les DataRows dans t1 qui ne sont pas dans t2.ayant des problèmes avec jointure à gauche LINQ

Dans SQL, ce que je suis en train d'accomplir est:

select t1.* 
from t1 
left join t2 
on t1.a=t2.a and 
    t1.b=t2.b and 
    t1.c=t2.c 
where 
    t2.a is null 

Jusqu'à présent, je donne les résultats suivants:

public DataTable t1_without_t2(DataTable t1, DataTable t2) 
     { 
      var query = from t1_row in t1.AsEnumerable() 
         join t2_row in t2.AsEnumerable() 
         on 
         new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"]} 
         equals 
         new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"]} 
         into leftJoinT1withoutT2 
         from join_row in leftJoinT1withoutT2.DefaultIfEmpty() 
         where t2_row["a"] == null 
         select new 
         { 
          j_a = join_row["a"], 
          j_b = join_row["b"], 
          j_c = join_row["c"], 
         }; 
      DataTable dt = t1.Clone(); 
      foreach (var result in query) 
      { 
       dt.LoadDataRow(
        new object[] 
        { 
         result.j_a, 
         result.j_b, 
         result.j_c 
        }, 
        false); 
      } 
      return dt; 
     } 

Ce échoue sur la ligne j_a = join_row["a"] avec ce message: Column 'a' does not belong to table.

Je pensais que la ligne into leftJoinT1withoutT2 était censée mettre les résultats de la jointure dans un var avec la colonne stru cture de la table t1, à partir de laquelle les entrées non correspondantes seraient supprimées en utilisant where t2_row["a"] == null. N'est-ce pas ce qui se passe ici? Je suis un peu confus.

+0

Votre requête ne compile pas – horgh

+0

@KonstantinVasilcov, oui, la ligne 'where t2_row [" a "] == null'. désolé, j'avais commenté cette ligne tout en essayant de déboguer cela. Je ne sais pas pourquoi il ne compile pas, t2_row' ne devrait-il pas être visible à ce niveau de la requête? – sigil

Répondre

1

Il devrait ressembler à ceci:

var query = from t1_row in t1.AsEnumerable() 
      join t2_row in t2.AsEnumerable() 
      on 
      new { t_a = t1_row["a"], t_b = t1_row["b"], t_c = t1_row["c"] } 
      equals 
      new { t_a = t2_row["a"], t_b = t2_row["b"], t_c = t2_row["c"] } 
      into leftJoinT1withoutT2 
      from join_row in leftJoinT1withoutT2.DefaultIfEmpty() 
               .Where(r => r == null) 
      select new 
      { 
       j_a = t1_row["a"], 
       j_b = t1_row["b"], 
       j_c = t1_row["c"], 
      }; 

Jetez un oeil à How to: Perform Left Outer Joins (C# Programming Guide).

Le join_row obtient null (à savoir la valeur par défaut TSource, voir Enumerable.DefaultIfEmpty) lorsqu'il n'y a pas d'élément correspondant dans t2, tandis que t1_row contient toujours la valeur jointe. Donc, dans la mesure où vous n'avez besoin que des lignes pour lesquelles join_row est null, j'ai utilisé .Where(r => r == null).

+0

Большое спасибо – sigil

+0

@sigil рад помочь – horgh

Questions connexes