Je suis nouveau à linq et j'ai du mal à écrire deux requêtes simples. Pour une raison quelconque, je ne peux pas envelopper ma tête autour d'elle.Comment interroger une collection d'objets dans LINQ par une propriété enfant?
sa structure simple: une commande a OrderItems. Chaque orderItem a un productID.
Je voudrais:
obtenir toutes les commandes qui ont ordonné productId 3
obtenir toutes les commandes qui ont ordonné productId 4 et 5 du même ordre.
Je l'ai essayé de plusieurs façons. les deux requêtes sont au bas de la petite application de test.
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();
}
}
}
parfait, merci! Je suppose que je n'étais pas trop loin. Existe-t-il un moyen pour la collection OrderItems d'avoir uniquement les ID de produit correspondants? disons que je voulais une collection de commandes où les seuls articles de commande dans chaque commande étaient égaux aux produits que j'ai passés. –
Voulez-vous dire que vous voulez filtrer toutes les commandes qui ont eu d'autres produits, ou que vous voulez créer une nouvelle copie de la commande mais avec seulement les produits pertinents? –
Créer une nouvelle copie avec seulement les produits pertinents. –