2012-12-17 117 views
2

我有兩個數據表t1t2。我試圖執行一個LINQ左連接,多個equijoin,以獲得不在t2中的t1中的DataRows。遇到左連接問題LINQ

在SQL中,我想要做到的是:

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 

到目前爲止,我有以下幾點:

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; 
     } 

這未能與此消息系j_a = join_row["a"]Column 'a' does not belong to table.

我認爲into leftJoinT1withoutT2行應該把連接的結果放入一個var與列stru表t1,從中可以使用where t2_row["a"] == null從中刪除不匹配的條目。這不是這裏發生的事情嗎?我有點困惑。

+0

您的查詢無法編譯 – horgh

+0

@KonstantinVasilcov,是的,'where t2_row [「a」] == null'行。對不起,我已經在嘗試調試時發表了評論。我不知道它爲什麼不編譯,不應該在查詢的這個級別顯示「t2_row」? – sigil

回答

1

它應該是這樣的:

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"], 
      }; 

看一看How to: Perform Left Outer Joins (C# Programming Guide)

join_row的獲取null(即默認TSource值,見Enumerable.DefaultIfEmpty)當在t2沒有匹配的元件,而t1_row總是包含加入值。所以,只要你需要那些join_rownull的行,我就用.Where(r => r == null)

+0

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

+0

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