Using pivot table in linq

c#, linq, list, pivot

Solution

You can do this:

var results = Data.GroupBy(l => new { l.Crew, l.NameSurname});
    .SelectMany( (key, g) => 
                 new 
                 { 
                     Crew = Key.Crew,
                     NameSurname = Key.NameSurname,  
                     groups = g 
                 });

var pivoted = new List<PivotedCrew>();

foreach(var item in results)
{
    pivoted.Add( 
        new PivotedCrew
        {
            Crew  = item.Crew,
            NameSurname = item.NameSurname,
            Q1 = item.groups.Where(x => x.Period == "Q1")
                     .FirstOrDefault().value,
            Q2 = item.groups.Where(x => x.Period == "Q2")
                     .FirstOrDefault().value,
            Q3 = item.groups.Where(x => x.Period == "Q3")
                     .FirstOrDefault().value
        });
}

But you will need to define a new class. Something like:

public class PivotedCrew
{
    public string Crew Id {get; set;}
    public string NameSurname {get; set;}
    public string Q1 {get; set;}   
    public string Q2 {get; set;}   
    public string Q3 {get; set;}   
}

Problem

I have the following Dynamic List ``` Crew NameSurname Period Result ABC John DOE Q1 54,09 ABC John DOE Q2 59,57 ABC John DOE Q3 62,11 ``` How can I get this result with in linq. ``` Crew NameSurname Q1 Q2 Q3 ABC John DOE 47,51 47,51 51,46 ``` I've tried this way but I couldn't get the result ``` List.GroupBy(c => c.PersonnelID) .Select(g => new { PersonnelID = g.Key, Period1 = g.Where(c => c.Period == 1).Sum(c => c.Result), Period2 = g.Where(c => c.Period == 2).Sum(c => c.Result), Period3 = g.Where(c => c.Period == 3).Sum(c => c.Result) }); ```

Original source

Related problems