using System.Collections.Generic;
public static void Main()
List<Order> orders = new List<Order>
new Order { UserId = 1, OrderId =1, Email = "blah1", PostCode = 111, Country = "au" },
new Order { UserId = 2, OrderId =1, Email = "blah2", PostCode = 111, Country = "au" },
new Order { UserId = 3, OrderId =2, Email = "blah1", PostCode = 111, Country = "au" },
new Order { UserId = 4, OrderId =2, Email = "blah2", PostCode = 111, Country = "au" },
new Order { UserId = 5, OrderId =3, Email = "blah3", PostCode = 111, Country = "nz" },
new Order { UserId = 6, OrderId =3, Email = "blah3", PostCode = 111, Country = "nz" },
new Order { UserId = 7, OrderId =5, Email = "blah5", PostCode = 111, Country = "au" },
var query = from ord in orders
group ord by new { ord.Country, ord.PostCode } into g
PostCode = g.Key.PostCode,
Orders = g.GroupBy(x => x.OrderId)
.GroupBy(i => i.Count() > 1 ?
new { OrderID = i.Key, Email = default(string) }
: new { OrderID = default(int), i.First().Email })
.Select(o => o.Count() == 1 ?
new { o.Key, Orders = o.First().ToList() }
: new { o.Key, Orders = o.Select(z => z.First()).ToList() })
foreach (var data in query)
Console.WriteLine("Country : {0}, PostCode : {1}", data.Country, data.PostCode);
foreach (var ord in data.Orders)
Console.WriteLine(String.IsNullOrEmpty(ord.Key.Email) ? "OrderID : " + ord.Key.OrderID.ToString() : "Email: " + ord.Key.Email);
foreach (var ords in ord.Orders)
Console.WriteLine("UserId : {0}", ords.UserId);
Console.WriteLine("-----");
public int UserId { get; set; }
public int OrderId { get; set; }
public string Email { get; set; }
public int PostCode { get; set; }
public string Country { get; set; }