如何在保留兩個表中的所有列的同時,使用以下表格和條件將兩個數據表格留在外部連接(我認爲它是左外連接但我不是100%確定)?如何左外連接在c#中的兩個數據表?
dtblLeft:
id col1 anotherColumn2
1 1 any2
2 1 any2
3 2 any2
4 3 any2
5 3 any2
6 3 any2
7 any2
dtblRight:
col1 col2 anotherColumn1
1 Hi any1
2 Bye any1
3 Later any1
4 Never any1
dtblJoined:
id col1 col2 anotherColumn1 anotherColumn2
1 1 Hi any1 any2
2 1 Hi any1 any2
3 2 Bye any1 any2
4 3 Later any1 any2
5 3 Later any1 any2
6 3 Later any1 any2
7 any2
條件:
- 在dtblLeft中,col1不需要具有唯一值。
- 在dtblRight中,col1具有唯一值。
- 如果dtblLeft在col1中缺少一個外鍵,或者它有一個在dtblRight中不存在的外鍵,那麼將插入空字段或空字段。
- 加入col1。
我可以使用普通的DataTable操作,LINQ,或什麼的。
我試過,但它消除重複:
dtblA.PrimaryKey = new DataColumn[] {dtblA.Columns["col1"]}
DataTable dtblJoined = new DataTable();
dtblJoined.Merge(dtblA, false, MissingSchemaAction.AddWithKey);
dtblJoined.Merge(dtblB, false, MissingSchemaAction.AddWithKey);
編輯1:
這是靠近我我想要什麼,但它只有從表中的一個(列發現於此link):
dtblJoined = (from t1 in dtblA.Rows.Cast<DataRow>()
join t2 in dtblB.Rows.Cast<DataRow>() on t1["col1"] equals t2["col1"]
select t1).CopyToDataTable();
編輯2:
從這個link的回答似乎爲我工作,但我不得不改變這一點,如下所示:
DataTable targetTable = dtblA.Clone();
var dt2Columns = dtblB.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
where targetTable.Columns.Contains(dc.ColumnName) == false
select dc;
targetTable.Columns.AddRange(dt2FinalColumns.ToArray());
var rowData = from row1 in dtblA.AsEnumerable()
join row2 in dtblB.AsEnumerable()
on row1["col1"] equals row2["col1"]
select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
foreach (object[] values in rowData)
targetTable.Rows.Add(values);
我也發現了這個link,我可能會嘗試了這一點,因爲它看起來更簡潔。
EDIT 3(2013年11月18日):
更新的表,以反映更多的情況。
這也是自然連接。告訴我們dtblA有'4'和dtblB不會發生什麼。 – Shoe
已更新,以顯示dtblA與4 – Soenhay
以防萬一你錯過了關於同一問題上的這些其他職位 [請點擊這裏](http://stackoverflow.com/questions/10404039/left-join-datatables-how-do-我得到這個工作)[和這裏](http://stackoverflow.com/questions/9055180/datatables-left-join-c-sharp) – Rwiti