Chandrashekar
3/23/2016 - 10:17 AM

PIVOT Datatable to Datatable in C# using Linq

PIVOT Datatable to Datatable in C# using Linq

 DataTable dtSource = new DataTable();
                    dtSource = objAccountService.GetEngineerSkillAtpScoreForAccount(UserSession.CenterId, Convert.ToInt32(rcbAccount.SelectedValue), Convert.ToInt32(rcbATP.SelectedValue));
                    DataTable dtSourcePvt = new DataTable();
                    dtSourcePvt = Pivot(dtSource, dtSource.Columns[1], dtSource.Columns[2]);
                    rgdRpt.DataSource = dtSourcePvt;
                    
-------------------------------------------------------------------------------                    

DataTable Pivot(DataTable dt, DataColumn pivotColumn, DataColumn pivotValue)
        {
            // find primary key columns 
            //(i.e. everything but pivot column and pivot value)
            DataTable temp = dt.Copy();
            temp.Columns.Remove(pivotColumn.ColumnName);
            temp.Columns.Remove(pivotValue.ColumnName);
            string[] pkColumnNames = temp.Columns.Cast<DataColumn>()
                .Select(c => c.ColumnName)
                .ToArray();

            // prep results table
            DataTable result = temp.DefaultView.ToTable(true, pkColumnNames).Copy();
            result.PrimaryKey = result.Columns.Cast<DataColumn>().ToArray();
            dt.AsEnumerable()
                .Select(r => r[pivotColumn.ColumnName].ToString())
                .Distinct().ToList()
                .ForEach(c => result.Columns.Add(c, pivotValue.DataType));
            //.ForEach(c => result.Columns.Add(c, pivotColumn.DataType));

            // load it
            foreach (DataRow row in dt.Rows)
            {
                // find row to update
                DataRow aggRow = result.Rows.Find(
                    pkColumnNames
                        .Select(c => row[c])
                        .ToArray());
                // the aggregate used here is LATEST 
                // adjust the next line if you want (SUM, MAX, etc...)
                aggRow[row[pivotColumn.ColumnName].ToString()] = row[pivotValue.ColumnName];
            }

            return result;
        }