DataRows для DataTable - PullRequest
       24

DataRows для DataTable

0 голосов
/ 03 июня 2018

Я хочу объединить два DataTable в один DataTable, проблема в том, что у него нет первичного ключа.Я кое-как достиг этого, используя этот код.

var result = (from t1 in table1.AsEnumerable()
                          join t2 in table2.AsEnumerable()
                          on table1.Rows.IndexOf(t1) equals table2.Rows.IndexOf(t2)
                          select  new { t1, t2 });

Но мой результат - анонимный тип DataRow.Я хочу преобразовать его в новый DataTable

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Ваш linq вообще не возвращает DataRow;он возвращает анонимный кортеж из двух DataRows.(Или, точнее, Enumarable)

Я не думаю, что вы можете создать новый DataRow из этого простым (или не очень простым) linq.

Вместо этого вам нужно будет создать строки из нового DataTable ( после создания этой таблицы) и затем заполнить поля одно за другим.

Причина в том, что DataRow не имеет значимого конструктора.

Чтобы создать DataRow, вам всегда нужен DataTable;тогда можно написать функцию:

DataRow MergeRows(DataTable dt, DataRow row1, DataRow row2)
{
    var row3 = dt.NewRow();

    for (int i = 0; i < row1.ItemArray.Length; i++)
    {
        row3.SetField(i, row1.ItemArray[i]);
    }
    int colCount1 = row1.ItemArray.Length;
    for (int i = 0; i < row2.ItemArray.Length; i++)
    {
        row3.SetField(i + colCount1 , row2.ItemArray[i]);
    }
    return row3;
}

Предполагается, что поля будут совпадать.

Для создания 3-го DataTable просто добавьте все столбцы;Есть способы использовать DataTable.Merge(), но, вероятно, проще использовать небольшую вспомогательную функцию:

List<DataColumn> MergeColumns(DataTable dt1, DataTable dt2)
{
  var cols = new List<DataColumn>();
  foreach (DataColumn c in dt1.Columns) cols.Add(new DataColumn(c.ColumnName, c.DataType));
  foreach (DataColumn c in dt2.Columns) cols.Add(new DataColumn(c.ColumnName, c.DataType));
  return cols;
}

И добавить результат:

table3.Columns.AddRange(MergeColumns(table1, table2).ToArray());

Теперь ваш linq можно изменить на

 var result = (from t1 in table1.AsEnumerable()
                      join t2 in table2.AsEnumerable()
                      on table1.Rows.IndexOf(t1) equals table2.Rows.IndexOf(t2)
                      select MergeRows(table3, t1, t2) );

Теперь вы можете создать 3-й DataTable (снова!) Из строк:

if (result.Count() > 0)
    table3 =  result.Cast<DataRow>().ToArray().CopyToDataTable();  
0 голосов
/ 03 июня 2018

Вы можете попробовать linq Concat.

var result = 
  (from t1 in table1.AsEnumerable() select t1).Concat
  (from t2 in table2.AsEnumerable() select t2);

Если вы хотите отфильтровать то же значение, вы можете использовать Union

var result =
 (from t1 in table1.AsEnumerable() select t1).Union
  (from t2 in table2.AsEnumerable() select t2);

c # онлайн: http://rextester.com/WUHC39800

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...