using System.Collections.Generic;
static void Main(string[] args)
var createdOnOrder1 = new DateTime(2016, 12, 31);
var createdOnOrder2 = new DateTime(2017, 12, 31);
var orderLinesList1 = new List<OrderLine>()
Name = "FirstOrderFirstOL",
StatusId = (int)OrderLineStatusEnum.Executed
Name = "FirstOrderSecondOL",
StatusId = (int)OrderLineStatusEnum.InProgress
Name = "FirstOrderThirdOL",
StatusId = (int)OrderLineStatusEnum.InProgress
var orderLinesList2 = new List<OrderLine>()
Name = "SecondOrderFirstOL",
StatusId = (int)OrderLineStatusEnum.Executed
Name = "SecondOrderSecondOL",
StatusId = (int)OrderLineStatusEnum.InProgress
Name = "SecondOrderThirdOL",
StatusId = (int)OrderLineStatusEnum.Executed
List<Order> orders = new List<Order>()
OrderLines = orderLinesList1,
CreatedOn = createdOnOrder1
OrderLines = orderLinesList2,
CreatedOn = createdOnOrder2
orderLinesList1.ForEach(x => x.Order = orders.First());
orderLinesList2.ForEach(x => x.Order = orders.Skip(1).First());
var orderLines = new List<OrderLine>();
orderLines.AddRange(orderLinesList1);
orderLines.AddRange(orderLinesList2);
var sortedOrderLines = orderLines.GroupBy(x => x.OrderId).OrderBy(g => g.Min(s => s.StatusId)).ThenByDescending(g => g.Max(s => s.Order.CreatedOn)).SelectMany(ol => ol).OrderBy(p => 0).ToList();
sortedOrderLines.ForEach(ol => Console.WriteLine(ol.Name));
public int Id { get; set; }
public string Name { get; set; }
public int OrderId { get; set; }
public int StatusId { get; set; }
public Order Order { get; set; }
public int Id { get; set; }
public List<OrderLine> OrderLines { get; set; }
public DateTime CreatedOn { get; set; }
public enum OrderLineStatusEnum