Объединить две таблицы данных в C #? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть две таблицы данных ..

DataTable dtTemp= new DataTable();
            dtTemp.Columns.AddRange(new[]
            {
                new DataColumn("segment_id", typeof(int)),
                new DataColumn("seg_description")
            });


DataTable dtTemp2 = new DataTable();
dtTemp2.Columns.Add("set_id",typeof(int));

Теперь давайте добавим несколько строк в первую таблицу ..

segment_id|seg_description
------    |---------------
   1      | desc..
   2      | desc2..
   3      | desc3..

Теперь давайте добавим некоторые данные во вторую таблицу ..

 set_id
--------
   1
--------
   2

Теперь я хочу, чтобы эти две таблицы оказались ниже вывода

set_id  | segment_id |seg_description
--------| ---------- | --------------
    1   |    1       |  desc..
    1   |    2       | desc2..
    1   |    3       | desc3..
    2   |    1       |   desc..
    2   |    2       | desc2..
    2   |    3       | desc3.. 

Как это сделать? С помощью Merge () я могу добиться этого?

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

То есть вы хотите "перекрестно соединить" таблицы, построив декартово произведение всех строк?Конечно, нет встроенного способа, вы можете использовать этот метод:

public static DataTable CrossJoinTables(DataTable t1, DataTable t2)
{
    if (t1 == null || t2 == null)
        throw new ArgumentNullException("t1 or t2", "Both tables must not be null");

    DataTable t3 = t1.Clone();  // first add columns from table1
    foreach (DataColumn col in t2.Columns)
    {
        string newColumnName = col.ColumnName;
        int colNum = 1;
        while (t3.Columns.Contains(newColumnName))
        {
            newColumnName = string.Format("{0}_{1}", col.ColumnName, ++colNum);
        }
        t3.Columns.Add(newColumnName, col.DataType);
    }

    IEnumerable<object[]> crossJoin = 
        from r1 in t1.AsEnumerable()
        from r2 in t2.AsEnumerable()
        select r1.ItemArray.Concat(r2.ItemArray).ToArray();

    foreach(object[] allFields in crossJoin)
    {
        t3.Rows.Add(allFields);
    }

    return t3;
}

Использование:

DataTable tblresult = CrossJoinTables(dtTemp2, dtTemp); // swapped order because you want columns from dtTemp2 first
0 голосов
/ 18 мая 2018

Как насчет этого:

var dt1 = dtTemp1.AsEnumerable();
var dt2 = dtTemp2.AsEnumerable();

var q = from x in dt1
        from y in dt2
        select new { set_id = (int)y["set_id"], segment_id = (int)x["segment_id"], seg_description = (string)x["seg_description"] };
0 голосов
/ 18 мая 2018

Для этого вам нужно использовать операцию CROSS JOIN .

Select * Table1 CROSS JOIN Table2

Он буквально дает произведение двух таблиц: каждая строка в A соединяется с каждой строкой в ​​B. Если A имеет 100 строк, а B имеет 100 строк, перекрестное соединение имеет 10 000 строк.

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