用于Unpivoting DataTable的Lambdaexpression式

我正在阅读Excel格式的数据,格式如下:

在这里输入图像说明

我需要按以下方式存储数据 –

在这里输入图像描述

我试图用Linq lambdaexpression式的帮助来做到这一点,但我想我没有得到任何与此。

我试过 –

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= pd // } // );` 

我将使用ToDictionary和一组预定义的名称:

 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)) } ); } 

这是规范化的版本。 如果你想要它平坦,使用:

 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(); } 

如果types不总是int,那么您可能需要使用x.Field<String>(d)并检查其有效性。