2015-09-04 2 views
0

У меня есть ADO DataTable следующегоDynamic LINQ GroupBy и выберите столбцы из ADO DataTable и вернуть DataTable

tname cname rgname schools mtext 
tn1  cn1  rg1  1  mxt1 
tn1  cn1  rg1  2  mxt1 
tn1  cn1  rg1  3  mxt1 
tn2  cn2  rg2  5  mxt2 
tn2  cn2  rg2  8  mxt2 
tn2  cn2  rg2  3  mxt2 
tn3  cn1  rg1  7  mxt1 
tn3  cn1  rg1  4  mxt1 

Я хочу, чтобы создать таблицу из приведенных выше таблиц, группируя и конкатенацию школы запятой разделена. Результат должен выглядеть так:

tname cname rgname schools mtext 
tn1  cn1  rg1  1,2,3 mxt1 
tn2  cn2  rg2  5,8,3 mxt2 
tn3  cn1  rg1  7,4  mxt1 

Я знаю группу по столбцам только во время выполнения. Я также хочу, чтобы результат был аналогичным, поскольку число столбцов больше (до 15). S можно использовать динамическую группу и выбрать лямбда-выражение.

Я реализовал логику для динамической группы, но динамический выбор беспокоит меня.

var result = from o in DT.AsEnumerable() 
     group o by new 
     { 
      cname = groupByCname? o.Field<string>("cname") : null, 
      tname = groupByTname? o.Field<string>("tname") : null, 
      rgname = groupByRGname? o.Field<string>("rgname") : null, 
      mtext = groupByMtext? o.Field<string>("mtext") : null, 
     } into g 
     select new 
     { 
     //Here i want to select all columns from DT and have schools as 
     // comma separated 
     schools = String.Join(",",g.Select(x=>x.Field<string> ("Schools")).ToArray()) 
     }; 

Спасибо за вашу помощь

+0

Это сближается: http://stackoverflow.com/q/31082791/861716 –

+0

На самом деле, ваш собственный код будет делать хорошо для меня. –

+0

Вышеупомянутый ожидает единственный параметр, но у меня есть возможность для нескольких групп. Так может быть указанная выше ссылка не работает. –

ответ

0

Я сделал некоторые изменения в ваш code.This может быть не лучший подход, но это не дает вам то, что вы хотите.

var result = from row in 
     (from t in 
      (from o in dt.AsEnumerable() 
      join u in dt.AsEnumerable() 
      on o.Field<string>("tname") equals u.Field<string>("tname") 
      select new 
      { 
       o, 
       u = String.Join(",", u.Field<string>("schools")) 
       }) 
       group t by new 
       { 
        tname = t.o.Field<string>("tname"), 
        cname = t.o.Field<string>("cname"), 
        rgname = t.o.Field<string>("rgname"), 
        mtext = t.o.Field<string>("mtext") 
       } into gcs 
       select new 
       { 
        rows = gcs.Select(x => x.o).First(), 
        schools = gcs.Select(x => x.u).Take(gcs.Key.tname.Count()) 
       }) 
    select row; 

DataTable resultTable = new DataTable(); 
resultTable = dt.Clone(); 

foreach (var item in result) 
{ 
    DataRow row = resultTable.NewRow(); 

    for (int i = 0; i < item.rows.ItemArray.Length; i++) 
    { 
     if (row.Table.Columns[i].ToString() == "schools") 
     { 
      row[i] = string.Join(", ", item.schools.ToList()); 
     } 
     else 
     { 
      row[i] = item.rows.ItemArray[i]; 
     } 
    } 

    resultTable.Rows.Add(row); 
} 
+0

Благодарим вас за ответ. Группа по столбцам также динамична, мой способ обработки группы неправильным? Я имею в виду, что несколько раз группой по столбцам будет только tname, rgname. –

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