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 target
DataTable
:
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);
}
Affichez http://www.codeproject.com/Articles/44274/Transpose-a-DataTable-using-C –
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 –