2013-08-16 3 views
1

J'ai un datatable comme ci-dessousrestructuration (interversion) datatable en C#

TableName RowId columnname ColumnValue 
    A   1  C1   V1 
    A   1  C2   V2 
    A   2  C1   V3 
    A   2  C2   V4 

Je veux transposer au-dessous de la structure

TableName RowId C1 C2 
    A   1  V1 V2 
    A   2  V3 V4 

Comment faire en C#?

+1

Affichez http://www.codeproject.com/Articles/44274/Transpose-a-DataTable-using-C –

+0

Vous pouvez faire un groupe par le les données et créer un autre datatable avec des données restructurées. Obtenez l'énumérable pour les données de table de données et le groupe par TableName, RowId, ColumnName. Transpose question connexe: http://stackoverflow.com/questions/9958821/transpose-in-datatable-in-asp-net?rq=1 –

Répondre

2

J'ai préparé une petite solution complexe, qui ne nécessite pas quelles valeurs sont cachées à l'intérieur ColumnName colonne de la source DataTable:

Source DataTable préparation:

var source = new DataTable(); 
source.Columns.Add(new DataColumn("TableName", typeof(string))); 
source.Columns.Add(new DataColumn("RowId", typeof(int))); 
source.Columns.Add(new DataColumn("ColumnName", typeof(string))); 
source.Columns.Add(new DataColumn("ColumnValue", typeof(string))); 

source.Rows.Add("A", 1, "C1", "V1"); 
source.Rows.Add("A", 1, "C2", "V2"); 
source.Rows.Add("A", 2, "C1", "V3"); 
source.Rows.Add("A", 2, "C2", "V4"); 

cible DataTable préparation:

var target = new DataTable(); 
target.Columns.Add(new DataColumn("TableName", typeof(string))); 
target.Columns.Add(new DataColumn("RowId", typeof(int))); 

Requête LINQ d'assistance:

var query = from r in source.AsEnumerable() 
      let i = new 
      { 
       TableName = r.Field<string>("TableName"), 
       Id = r.Field<int>("RowId"), 
       ColumnName = r.Field<string>("ColumnName"), 
       ColumnValue = r.Field<string>("ColumnValue") 
      } 
      group i by new { i.TableName, i.Id } into g 
      select g; 

données Insertion d'éléments dans targetDataTable:

foreach (var item in query) 
{ 
    var newRow = target.NewRow(); 

    // static columns 
    newRow["TableName"] = item.Key.TableName; 
    newRow["RowId"] = item.Key.Id; 

    // dynamic columns 
    foreach (var c in item) 
    { 
     if(!target.Columns.Contains(c.ColumnName)) 
     { 
      target.Columns.Add(new DataColumn(c.ColumnName, typeof(String))); 
     } 

     newRow[c.ColumnName] = c.ColumnValue; 
    } 

    target.Rows.Add(newRow); 
} 
+0

A travaillé parfaitement, merci. – user1447718