2016-09-14 87 views
0

我有兩個表,比如dt1和dt2。
我想找到DT1的數據,但基於一些列DT2不匹配。(動態)LINQ:如何使用動態密鑰連接兩個數據表

我想出的方法是左連接兩個表,找到那些列與空值。
但問題是如何將它們與動態列號一起加入。
例如,如果最初我想通過N列連接它們,但是如果dt2中的列1爲空或空,那麼我想通過其餘的N-1列連接它們。

例如:

DT1:

ColA, ColB, ColC, ColD 
1A 1B 1C 1D 
2A 2B 2C 2D 
3A 3B 3C 3D 
4A 4B 4C 4D 

DT2:

ColAA ColBB ColCC, ColE 
1A  1B  null 1E 
2A  2X  null 2E 
3A  3B  3C  3E 
null null 4C  4E 

dt1 left join dt2 by ColA=ColAA, ColB=ColBB and ColC=ColCC

如果其中一個爲空,然後再加入其餘列。

預期的結果:

ColA, ColB, ColC, ColD, ColE 
1A 1B 1C 1D 1E 
2A 2B 2C 2D null 
3A 3B 3C 3D 3E 
4A 4B 4C 4D 4E 

與科爾空值的數據是我想要的(2A,2B,2C,2D,NULL)
現在我只能通過固定列加入他們的行列,如何。我可以達到上述情況嗎?

非常感謝。

+0

行1和行2中的數據是相同的。但爲什麼在預期的結果中,第1行和第2行是不同的?因爲第2行中的ColE爲空? – Mark

+0

如果數據不存在,那麼你不能加入它,你需要某種形式的一致性,否則你將在長期運行中創建一個更大的問題 –

+0

如果所有的行都有列ColCC null,該怎麼辦?所有行都具有相同的空列或填充值。但是我不知道哪個列會在運行時間爲空。例如,在第一輪中,對於所有行,ColCC可能爲空,而在第二輪中,對於所有行,ColAA和ColBB可能爲空。 –

回答

1

參見https://msdn.microsoft.com/en-us/library/bb882533.aspx


這聽起來像你想:

  from d1 in dt1 
     from d2 in dt2 
     where (d1.ColA==d2.ColAA or d2.ColAA == null) and 
       (d1.ColB==d2.ColBB or d2.ColBB == null) and 
       (d1.ColC==d2.ColCC or d2.ColCC == null) 
     select new { ..... }; 

我不是從你的問題肯定,如果這正是你想要的查詢時,您可能要添加例如and (d1.ColA==d2.ColAA or d1.ColB==d2.ColBB or d1.ColC==d2.ColCC),使他們無法連接所有空值

+0

在我的理解什麼OP需要是 '(d1.ColA == d2.ColAA和d2.ColAA!= null)' 加入兩列,提供的列值不包含'null'廣告示例 –

+0

是的,這是我需要的。 –