using System.Collections;
using System.Collections.Generic;
public static void Main()
var metrics = new List<Metrics>()
new Metrics { Id = 1, Metric = "Metric 1" },
new Metrics { Id = 2, Metric = "Metric 2" },
new Metrics { Id = 3, Metric = "Metric 2" }
var metricValuePerPerson = new List<MetricsValuePerPerson>()
new MetricsValuePerPerson { Id = 1, PersonId = 1, MetricId = 1, Value = "Test 1" },
new MetricsValuePerPerson { Id = 2, PersonId = 1, MetricId = 2, Value = "Test 2" },
new MetricsValuePerPerson { Id = 3, PersonId = 1, MetricId = 3, Value = "Test 3" }
var result = metricValuePerPerson.GroupJoin(metrics, mv => new { Id = mv.PersonId }, m => new { Id = m.Id },
(mv, m) => new { mv = mv, m = m })
.SelectMany(x => x.m.DefaultIfEmpty(), (x, y) => new {mv = x.mv, m = y })
.GroupBy(g => g.mv.PersonId)
var grouped = x.ToList();
Metric1 = grouped[0].mv.PersonId + "|" + grouped[0].m.Metric + "|" + grouped[0].mv.Value,
Metric2 = grouped[1].mv.PersonId + "|" + grouped[1].m.Metric + "|" + grouped[1].mv.Value,
Metric3 = grouped[2].mv.PersonId + "|" + grouped[2].m.Metric + "|" + grouped[2].mv.Value,
foreach (var item in result)
public int Id { get; set; }
public string Metric { get; set; }
public class MetricsValuePerPerson
public int Id { get; set; }
public int PersonId { get; set; }
public int MetricId { get; set; }
public string Value { get; set; }