2015-09-04 67 views
0

我有一個ADO數據表如下從ADO數據表動態LINQ GROUPBY和選擇列,並返回數據表

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有可能通過並選擇lambda表達式來使用動態組。

我已經實現了動態組的邏輯,但動態選擇讓我感到困擾。

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

我已經做了一些修改您的代碼。此可能不是最好的方法,但它確實給你你想要的東西。

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。 –