I have a nested list structure with Customers → Orders → OrderItems. I am trying to find LINQ or another query that will return Customers and their nested elements, where the quantity OrderItem = 1. However, it should not return any Orders or OrderItems where the quantity! = 1.
I tried this:
var customers2 = customers.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)));
It correctly returns only Customers with order elements quantity = 1, but also returns all other orders and order elements.
I can get the desired results with a pair of For-each loops, but I would like to find something more elegant:
foreach (var customer in customers2) { customer.Orders = customer.Orders.Where(o => o.OrderItems.Exists(oi => oi.Quantity == 1)).ToList(); foreach (var order in customer.Orders) { order.OrderItems = order.OrderItems.Where(oi => oi.Quantity == 1).ToList(); } }
Here is the structure of the object and some sample data.
public class Customer { public int CustomerId { get; set; } public string Name { get; set; } public string Address { get; set; } public List<Order> Orders { get; set; } } public class Order { public int OrderId { get; set; } public int CustomerId { get; set; } public DateTime OrderDate { get; set; } public bool Shipped { get; set; } public List<OrderItem> OrderItems { get; set; } } public class OrderItem { public int OrderItemId { get; set; } public int OrderId { get; set; } public string ItemName { get; set; } public int Quantity { get; set; } } var customers = new List<Customer> { new Customer { CustomerId = 1, Name = "Shawn", Address = "123 Main Street", Orders = new List<Order>() { new Order() { OrderId = 100, CustomerId = 1, OrderDate = DateTime.Now, Shipped = true, OrderItems = new List<OrderItem>() { new OrderItem() { OrderItemId = 200, OrderId = 100, ItemName = "Computer", Quantity = 1 }, new OrderItem() { OrderItemId = 206, OrderId = 100, ItemName = "Hard Drive", Quantity = 2 } } }, new Order() { OrderId = 106, CustomerId = 1, OrderDate = DateTime.Now, Shipped = true, OrderItems = new List<OrderItem>() { new OrderItem() { OrderItemId = 207, OrderId = 106, ItemName = "Monitor", Quantity = 3 }, new OrderItem() { OrderItemId = 208, OrderId = 106, ItemName = "DVD Burner", Quantity = 2 } } } } }, new Customer { CustomerId = 2, Name = "Arianna", Address = "456 Main Street", Orders = new List<Order>() { new Order() { OrderId = 101, CustomerId = 2, OrderDate = DateTime.Now.AddDays(-10), Shipped = true, OrderItems = new List<OrderItem>() { new OrderItem() { OrderItemId = 201, OrderId = 101, ItemName = "barbie", Quantity = 2 } } } } }, new Customer { CustomerId = 3, Name = "Ryan", Address = "789 Main Street", Orders = new List<Order>() { new Order() { OrderId = 102, CustomerId = 3, OrderDate = DateTime.Now.AddDays(-5), Shipped = true, OrderItems = new List<OrderItem>() { new OrderItem() { OrderItemId = 203, OrderId = 103, ItemName = "Minecraft", Quantity = 2 } } } } } };