2013-10-31 19 views
0

我正在使用下面的內部聯接來檢索兩個表之間的數據,但所有數據都沒有被填充。我嘗試通過使用CCY1 == CCY1和PCODE == PCODE來實現外部連接,但沒有運氣。如何使用LINQ編寫外部聯接

enter image description here

var q = from g1 in TableCCY1.AsEnumerable() 
      join g2 in TableCCY2.AsEnumerable() 
      on g1.Field<string>("CCY1") equals g2.Field<string>("CCY1") 
      where g1.Field<string>("PCODE") == g2.Field<string>("PCODE") 
        select new 
        { 
          g1currency = g1.Field<string>("CCY1"), 
          g2currency = g2.Field<string>("CCY1"), 
          g1code = g1.Field<string>("PCODE"), 
          g2code = g2.Field<string>("PCODE"), 
          g1Amt1 = g1.Field<string>("AMT1"), 
          g2Amt2 = g2.Field<string>("AMT2") 
        }; 

感謝您的幫助。

+0

讓你的表成爲主鍵?你能更詳細地解釋你想達到什麼嗎? –

+0

CCY1和PCODE的組合是主鍵。我想要加入這兩個表並獲得AMT1和AMT2的SUM。黃色突出顯示的行是macthing。所以輸出總和(AMT1 + AMT2) – Ullan

+0

OK,那麼CCY2表中的GBP/D呢? –

回答

1

看起來你只是想聯盟/ CONCAT兩個表成一個,然後就組上那兩列。你在邏輯上不加入這兩個表。這實際上使它更容易。

var q = from row in TableCCY1.AsEnumerable().Concat(TableCCY2.AsEnumerable()) 
     group row by new 
     { 
      CCY1 = row.Field<string>("CCY1"), 
      PCode = row.Field<string>("PCODE") 
     } into matches 
     select new 
     { 
      CCY1 = matches.Key.CCY1, 
      PCODE = matches.Key.PCode, 
      Sum = matches.Sum(match => match.Field<decimal?>("AMT2")), 
     }; 
+0

很好的捕獲,他需要連接確實 –

+1

@lazyberezovsky我寫了一個類似於你的答案,最初也是如此,但是它在進一步檢查時與預期輸出不匹配。 – Servy

+0

@Servy,謝謝你,我應該更具體地發佈我的問題。現在讓我測試你的代碼 – Ullan

2

對於左連接您可以使用此approuch:http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

的代碼應該是:

var q = from g1 in TableCCY1 
      join g2 in TableCCY2 on g1.CCY1 equals g2.CCY1 && g1.PCODE equals g2.PCODE into TableCCY3 
from g3 in TableCCY3.DefaultIfEmpty() 
select new 
        { 
          g1currency = g1.CCY1, 
          g2currency = (g3 == null ? String.Empty : g3.CCY1), 
          g1code = g1.PCODE, 
          g2code = (g3 == null ? String.Empty : g3.PCODE), 
          g1Amt1 = g1.AMT1, 
          g2Amt2 = (g3 == null ? 0 : g3.AMT2) 
        }; 
+0

添加代碼示例。 –