Mam zagnieżdżoną strukturę listy z klientami -> Zamówienia -> OrderItems. Próbuję znaleźć LINQ lub inne zapytanie, które zwróci Klientów i ich zagnieżdżonych elementów, gdzie OrderItem ilość = 1. Jednak nie powinien zwracać żadnych zamówień lub OrderItems, gdzie ilość! = 1.Zapytanie C# Lista do ograniczenia dzieci, ale powrót rodziców
Próbowałem to:
var customers2 = customers.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)));
Poprawnie zwraca tylko Klientów z ilością sztuk zamówienia = 1, ale zwraca również wszystkie inne Zamówienia i Pozycje Zamówienia.
mogę uzyskać pożądane rezultaty z kilku for-each pętli, ale chciałbym znaleźć coś bardziej eleganckie:
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();
}
}
Oto struktura obiektu i niektóre dane przykładowe.
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
}
}
}
}
}
};
Trzeba być ostrożnym z tym rozwiązaniem. Przypuśćmy, że korzystasz z ORM, może to zinterpretować usunięcie tych zamówień z listy, co oznacza, że chcesz usunąć te relacje z bazy danych. – StriplingWarrior
Jeśli zajdzie taka potrzeba, możesz zrobić kopię 'klienta' dla' testCust', aby obejść ten problem. – Jonesopolis
Właśnie dodałem pętle foreach, które mogą sprawić, że to zadziała - po prostu próbując uzyskać coś bardziej eleganckiego ... – adova