Как оставить внешнее соединение двух таблиц данных в C #?

Как я могу покинуть внешнее соединение (я думаю, что это левое внешнее соединение, но я не уверен на 100%) две таблицы данных со следующими таблицами и условиями, сохраняя все столбцы из обеих таблиц?

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:

Это близко к тому, что я хочу, но в нем есть только столбцы из одной из таблиц (находится на этомссылка на сайт ):

    dtblJoined = (from t1 in dtblA.Rows.Cast()
                  join t2 in dtblB.Rows.Cast() on t1["col1"] equals t2["col1"]
                  select t1).CopyToDataTable();

РЕДАКТИРОВАТЬ 2:

Ответ от этогоссылка на сайт кажется, работает для меня, но мне пришлось немного изменить его следующим образом:

DataTable targetTable = dtblA.Clone();
var dt2Columns = dtblB.Columns.OfType().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);

Я также нашел этоссылка на сайт и я мог бы попробовать это, так как это кажется более кратким.

РЕДАКТИРОВАТЬ 3 (18.11.2013):

Обновлены таблицы, чтобы отразить больше ситуаций.

Ответы на вопрос(3)

Ваш ответ на вопрос