Combine tables using row values as column LINQ C# SQL

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		List<User> users = new List<User>
            {
                new User { Id =1, Name = "Steve", Age = 21 },
                new User { Id =2, Name = "Jack", Age = 17 },
                new User { Id =3, Name = "Alice", Age = 25 },
                new User { Id =4, Name = "Harry", Age = 14 }
            };

            List<UserDetails> details = new List<UserDetails>
            {
                new UserDetails { UId =1, Feature = "Height", Value = "70"},
                new UserDetails { UId =2, Feature = "Height", Value = "65"},
                new UserDetails { UId =2, Feature = "Eyes", Value = "Blue"},
                new UserDetails { UId =4, Feature = "Height", Value = "51"},
                new UserDetails { UId =3, Feature = "Hair", Value = "Brown"},
                new UserDetails { UId =1, Feature = "Eyes", Value = "Green"},
            };

            var result = from user in users
                         join detail in details.GroupBy(x => new { x.UId, x.Feature })
                         on user.Id equals detail.Key.UId into g
                         select new
                         {
                             Id = user.Id,
                             Name = user.Name,
                             Age = user.Age,
                             Height = g.FirstOrDefault(z => z.Key.Feature == "Height") != null ? g.First(z => z.Key.Feature == "Height").First().Value : String.Empty,
                             Eyes = g.FirstOrDefault(z => z.Key.Feature == "Eyes") != null ? g.First(z => z.Key.Feature == "Eyes").First().Value : String.Empty,
                             Hair = g.FirstOrDefault(z => z.Key.Feature == "Hair") != null ? g.First(z => z.Key.Feature == "Hair").First().Value : String.Empty,
                         };

            Console.WriteLine("Id\tName\tAge\tHeight\tEyes\tHair");
            Console.WriteLine("---------------------------------------------");
            foreach (var item in result)
	        {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}",item.Id,item.Name,item.Age,item.Height,item.Eyes,item.Hair);
	        }
	}
}

public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class UserDetails
    {
        public int UId { get; set; }
        public string Feature { get; set; }
        public string Value { get; set; }
    }
;