2012-04-13 3 views
2

У меня есть Datatable под названием sourceTable с колонками source_Id, title и programme_Id. Второй Datatable - credits с колонками credit_Id, programme_Id. Все столбцы являются типом Int вместо заголовка столбца.Datatables, превышать, присоединяться

Колонка programme_Id в DataTable credits является внешним ключом ОТ DataTable sourceTable

То, что я хочу добиться того, чтобы Exceed таблицу sourceTable с колонной credit_Id из DataTable credits.

Я написал код, который работает, НО ОЧЕНЬ медленный, есть лучший способ!, FirstOrDefault поставит 0, если нет элемента, который я ищу, возможно, было бы лучше вернуть нулевое значение вместо 0 для этого случая

sourceTable.columns.Add("credits_Id"); 
var rowColl = credits.AsEnumerable(); 
foreach (DataRow row in sourceTable.Rows) 
{ 
    var credits_Id = 
     (from r in rowColl 
     where r.Field<int>("programme_Id") == Convert.ToInt32(row["programme_Id"].ToString()) 
     select r.Field<int>("credits_Id")).FirstOrDefault<int>(); 

    row["credits_Id"] = credits_Id; 
} 
+0

У обоих типов данных есть некоторый контент, заполненный из документа xml – Avicena00

+0

Я думаю, что преобразовать в ToString в Convert.ToInt32 (строка ["programme_Id"] не нужно. ToString() – Habib

+0

помогает немного (на одну минуту :), я вхожу в беду, потому что есть много строк – Avicena00

ответ

0

Он работает медленно, потому что вы повторяете все строки в таблице кредитов для каждой строки в исходной таблице. Вы можете использовать следующий запрос linq для соединения обеих таблиц.

(from sourceRow in sourceTable.Rows.OfType<DataRow>() 
join creditRow in credits.Rows.OfType<DataRow>() 
    on sourceRow.Field<int>("programme_Id") equals creditRow.Field<int>("programme_Id") 
select new {sourceRow, creditRow}) 
    .ForEach(o => o.sourceRow["credits_id"] = o.creditRow["sourceRow"]); 
0

Только в том случае, Google привел кого-то здесь: это решение на мой вопрос, что я достиг сейчас :)

var q = from c in sourceTable.AsEnumerable() 
        join o in credits.AsEnumerable() on c.Field<int>("programme_Id") equals o.Field<int>("programme_Id") into outer 
        from o in outer.DefaultIfEmpty() 
        select new 
        { 

         title=c.Field<string>("title"), 

         credits_Id = (o==null)?-1:o.Field<int>("credits_Id") 
        }; 
      var qToList = q.ToList(); 

теперь мы можем преобразовать этот список Datatable:

public static DataTable ListToDataTable<T>(List<T> list) 
    { 
     DataTable dtToConvert = new DataTable(); 
     try 
     { 

     foreach (PropertyInfo info in typeof(T).GetProperties()) 
     { 
      dtToConvert.Columns.Add(new DataColumn(info.Name, info.PropertyType)); 
     } 
     foreach (T t in list) 
     { 
      DataRow row = dtToConvert.NewRow(); 
      foreach (PropertyInfo info in typeof(T).GetProperties()) 
      { 
       row[info.Name] = info.GetValue(t, null); 
      } 
      dtToConvert.Rows.Add(row); 
     } 

     } catch(Exception ex) 
      { 


      } 
     return dtToConvert; 
    } 

Приветствия!

Смежные вопросы