2014-11-14 4 views
1

У меня 2 DataTables:Создание запросов с 2 DataTables

dt1:      dt2: 
    | id | num | value |  | id | num | name  | 
    |----+-----+-------|  |----+-----+-----------| 
    | 99| 1| + |  | 99 | 1| tiger  | 
    | 100| 2| + |  | 100| 2| pigeon | 
    | 101| 1| - |  | 101| 1| crocodile | 
    | 102| 1| + |  | 102| 1| panther | 
           | 105| 1| whale  | 

И я хочу, чтобы привязать его к одному DataTable:

| id | num | value | name | 
|----+-----+-------+----------| 
| 99 | 1| + |tiger  | 
| 100| 2| + |pigeon | 
| 101| 1| - |crocodile | 
| 102| 1| + |panther | 
| 105| 1|  |whale  | 

После этого я свяжу DataRow в DataGridView.

Я пытался создать запрос, но что-то в этом плохого, он не возвращает значение:

var vquery = (from dt1 in dtable1.AsEnumerable() 
       from dt2 in dtable2.AsEnumerable() 
       where dt1.Field<int?>(IndexesField.F_LINK_ID) == dt2.Field<int?>(IndexesField.F_LINK_ID) 
       where dt1.Field<int?>(IndexesField.F_TABKEY) == dt2.Field<int?>(IndexesField.F_TABKEY) 
       select new { dt1, dt2 }); 

Что мне нужно сделать, чтобы исправить это?

С уважением, Alexander.

ответ

1

Вы должны использовать DataTable.Merge вместо использования LINQ здесь.
Если у вашего DataTable s есть первичный ключ, он автоматически определит его, как вы хотите.

dtable1.PrimaryKey = new[] { dtable1.Columns["id"] }; 
dtable2.PrimaryKey = new[] { dtable2.Columns["id"] }; 
dtable1.Merge(dtable2); 
0

Если вы хотите использовать LINQ вы должны имитировать внешнее соединение, чтобы получить желаемые значения, а затем вставить их в 3 DataTable.

void Main() 
{ 
    DataTable dTable1 = new DataTable(); 
    DataTable dTable2 = new DataTable(); 

    dTable1.Columns.Add("id", typeof(int)); 
    dTable1.Columns.Add("num", typeof(int)); 
    dTable1.Columns.Add("value", typeof(string)); 

    dTable2.Columns.Add("id", typeof(int)); 
    dTable2.Columns.Add("num", typeof(int)); 
    dTable2.Columns.Add("name", typeof(string)); 

    dTable1.Rows.Add(new object [] { 99, 1, "+"}); 
    dTable1.Rows.Add(new object [] { 100, 1, "+"}); 
    dTable1.Rows.Add(new object [] { 101, 1, "-"}); 
    dTable1.Rows.Add(new object [] { 102, 1, "+"}); 

    dTable2.Rows.Add(new object [] { 99, 1, "tiger"}); 
    dTable2.Rows.Add(new object [] { 100, 1, "pigeon"}); 
    dTable2.Rows.Add(new object [] { 101, 1, "crocodile"}); 
    dTable2.Rows.Add(new object [] { 102, 1, "panther"}); 
    dTable2.Rows.Add(new object [] { 105, 1, "whale"}); 

    var vQuery = (from dt1 in dTable1.AsEnumerable() 
         join dt2 in dTable2.AsEnumerable() 
         on new { Id = dt1.Field<int?>(0), Num = dt1.Field<int?>(1) } 
        equals new { Id = dt2.Field<int?>(0), Num = dt2.Field<int?>(1) } 
        into temp 
        from defaultDt2 in temp.DefaultIfEmpty(null) 
       select new { 
         id = (dt1 ?? temp.First()).Field<int?>(0), 
        num = (dt1 ?? temp.First()).Field<int?>(1), 
        value = dt1 != null ? dt1.Field<string>(2) : null, 
        name = temp.First() != null ? temp.First().Field<string>(2) : null 
       }).Concat(
       (from dt1 in dTable2.AsEnumerable() 
         join dt2 in dTable1.AsEnumerable() 
         on new { Id = dt1.Field<int?>(0), Num = dt1.Field<int?>(1) } 
        equals new { Id = dt2.Field<int?>(0), Num = dt2.Field<int?>(1) } 
             into temp 
        from defaultDt2 in temp.ToList<DataRow>().DefaultIfEmpty(null) 
       select new 
       { 
         id = (temp.FirstOrDefault() ?? dt1).Field<int?>(0), 
        num = (temp.FirstOrDefault() ?? dt1).Field<int?>(1), 
        value = temp.FirstOrDefault() != null ? temp.FirstOrDefault().Field<string>(2) : null, 
        name = dt1 != null ? dt1.Field<string>(2) : null 
       })); 

    // At this point you will have the data you're after. 
} 
Смежные вопросы