I'm new to linq and having trouble writing two simple queries. For some reason, I cannot wrap my head around it.
its a simple structure: an Order has OrderItems. each orderItem has a productID.
I would like to:
get all orders that ordered productId 3
get all orders that ordered productId 4 AND 5 on the same order.
I've tried it a number of ways. the two queries are at the bottom of the little test app.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class Program
{
static void Main(string[] args)
{
OrderService svc = new OrderService();
//find all orders that purchased ProductID 3
IEnumerable<Order> data = svc.GetOrdersWithProduct(3);
//find all orders that purchase product 4 AND 5
IEnumerable<Order> data2 = svc.GetOrdersWithProduct(new int[] { 4, 5} );
}
}
public class Order
{
public int OrderId { get; set; }
public IEnumerable<OrderItem> Items { get; set; }
}
public class OrderItem
{
public int OrderItemId { get; set; }
public int OrderId { get; set; }
public int ProductId { get; set; }
}
public class OrderService
{
private static List<Order> GetTestData()
{
List<Order> orders = new List<Order>();
//5 Orders, 3 items each (every orderitem has a unique product in this test set)
int orderitemid = 1;
int productid = 1;
for (int orderid = 1; orderid < 6; orderid++)
{
orders.Add(new Order
{
OrderId = orderid,
Items = new List<OrderItem>
{
new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ },
new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ },
new OrderItem() { OrderId = orderid, OrderItemId = orderitemid++, ProductId = productid ++ }
}
});
}
return orders;
}
public IEnumerable<Order> GetOrdersWithProduct(int productId)
{
List<Order> orders = OrderService.GetTestData();
// ?? not really what i want, since this returns only if all items are the same
var result = orders.Where(o => o.Items.All(i => i.ProductId == productId));
return result.ToList();
}
public IEnumerable<Order> GetOrdersWithProduct(IEnumerable<int> productIds)
{
List<Order> orders = OrderService.GetTestData();
//??
var result = orders.Where(o => o.Items.All(productIds.Contains(i => i.ProductId)));
return result.ToList();
}
}
}