using System.Collections.Generic;
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
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 int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public int UId { get; set; }
public string Feature { get; set; }
public string Value { get; set; }