using System; using System.Collections.Generic; using System.Linq; namespace TestApp { class Program { public class Order { public Order() { Items = new List(); } public string Code { get; set; } public ICollection Items { get; set; } } public class OrderItem { public OrderItem() { SubItems = new List(); } public decimal Quantity { get; set; } public decimal Price { get; set; } public ICollection SubItems { get; set; } } public class SubItem { public DateTime Date { get; set; } public decimal Quantity { get; set; } public string UserName { get; set; } } static void Main(string[] args) { Order order = new Order(); order.Code = "123"; order.Items.Add(new OrderItem() { Price = 30, Quantity = 3, SubItems = new List() { new SubItem() { Date = DateTime.Now, Quantity = 1, UserName = "User1" }, new SubItem() { Date = DateTime.Now, Quantity = 2, UserName = "User2" } } }); order.Items.Add(new OrderItem() { Price = 500, Quantity = 50, SubItems = new List() { new SubItem() { Date = DateTime.Now, Quantity = 20, UserName = "User1" }, new SubItem() { Date = DateTime.Now, Quantity = 20, UserName = "User2" }, new SubItem() { Date = DateTime.Now, Quantity = 10, UserName = "User3" } } }); order.Items.Add(new OrderItem() { Price = 1000, Quantity = 50, SubItems = new List() }); var res = order.Items .SelectMany(i => i.SubItems.DefaultIfEmpty(), (Item, Sub) => new { Item, Sub }) .Select(r => new { order.Code, r.Item.Price, ItemQuantity = r.Item.Quantity, SubItemQuantity = r.Sub == null ? null : (Decimal?) r.Sub.Quantity ,UserName = r.Sub == null ? (string)null : r.Sub.UserName }); foreach(var x in res) { System.Console.WriteLine(x.ToString()); } } } }