2017-02-06 2 views
4

Ich lese Daten aus einer Excel-Tabelle in folgendem Format -Lambda Expression für Unpivoting Datatable

enter image description here

und ich brauche die Daten zu speichern in der folgenden Weg-

enter image description here

Ich versuche, es mit Hilfe von Linq Lambda Ausdruck zu tun, aber ich denke, ich komme damit nirgendwo hin.

Was ich versuchte -

 DataTable dataTable= ReadExcel(); 
     var dt = dataTable.AsEnumerable(); 

     var resultSet = dt.Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
         .GroupBy(x => 
            new 
            { 
             Month = x.Field<String>("Month"), 
             ProjectCode = x.Field<String>("Project_Code"), 
             //change designation columns into row data and then group on it 
             //Designation = 
            } 
           ); 
         //.Select(p => 
         //   new 
         //   { 
         //    Month= p.d 
         //   } 
         //  );` 
+0

Ich würde empfehlen, Power Query zu verwenden, um Ihre Daten zu entfernen - viel einfacher! –

+0

Hallo Charles. Ich habe mich gefragt, ob wir das mit Hilfe von Lambda-Ausdrücken tun könnten. Power Query ist etwas, das ich zuerst erkunden müsste. –

Antwort

2

Ich würde verwenden ToDictionary mit einem vordefinierten Satz von Benennungs Namen:

private static readonly string[] designationNames = {"PA","A","SA","M","SM","CON"}; 
void Function() 
{ 
    /* ... */ 
    var resultSet = dt.AsEnumerable().Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
      .Select(x => 
       new 
       { 
        Month = x.Field<String>("Month"), 
        ProjectCode = x.Field<String>("Project_Code"), 
        Designations = designationNames.ToDictionary(d => d, d => x.Field<int>(d)) 
       } 
      ); 
} 

Dies ist die normalisierte Version. Wenn Sie es flach stattdessen möchten, verwenden Sie:

private static readonly string[] designationNames = {"PA","A","SA","M","SM","CON"}; 

void Function() 
{ 
    /* ... */ 
    var resultSet = dt.AsEnumerable().Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
     .Select(x => 
      designationNames.Select(
       d => 
        new 
        { 
         Month = x.Field<String>("Month"), 
         ProjectCode = x.Field<String>("Project_Code"), 
         Designation = d, 
         Count = x.Field<int>(d) 
        } 
      ) 
     ).SelectMany(x => x).ToList(); 
} 

Wenn der Typ nicht immer int dann möchten Sie vielleicht x.Field<String>(d) stattdessen verwenden und auf Gültigkeit prüfen.

+0

Arbeitete wie ein Charme! :) –

+0

Ich musste AsEnumerable() in der Datentabelle hinzufügen, also 'var resultSet = dt.AsEnumerable(). Wo ...' sonst bekam ich ein '' Datatable 'enthält keine Definition für' Where '. .." Error. –