В моем приложении я разрешаю пользователю заказывать Food
товаров у разных поставщиков.Таким образом, Order
может иметь OrderDetail
элементов, поступающих от разных провайдеров .
Зная ProviderID
, как я могу получить только заказов , которые имеют наминимум 1 'OrderDetail' из указанного ProviderID
.
Я хочу упростить свое решение:
Сначала я получу все FoodID поставщика
List<int> providersFoodIDs = db.Foods
.Where(f => f.Availability && f.ProviderID == providerID)
.Select(f => f.FoodID).ToList();
Получение заказов
List<Order> allPendingOrders = db.Orders
.Where(o => o.Status == Enums.OrderStatus.Pending.ToString())
.Include(o => o.OrderDetails)
.ToList();
Копия заказов:
List<Order> allPendingOrdersCopy = db.Orders.AsNoTracking()
.Where(o => o.Status == Enums.OrderStatus.Pending.ToString())
.Include(o => o.OrderDetails)
.ToList();
Зациклить исходную коллекцию заказов, и если OrderDetail
не соответствует указанному Provider
, удалите элемент OrderDetail
из коллекции заказов на копирование.
foreach (Order pendingOrder in allPendingOrders)
{
foreach (OrderDetail orderDetail in pendingOrder.OrderDetails)
{
if (orderDetail.FoodID != null && !providersFoodIDs.Contains((int)orderDetail.FoodID))
{
Order order = allPendingOrdersCopy.FirstOrDefault(o => o.OrderID == pendingOrder.OrderID);
OrderDetail odetail = order?.OrderDetails.FirstOrDefault(od => od.OrderDetailID == orderDetail.OrderDetailID);
order?.OrderDetails.Remove(odetail);
}
}<br>
}
Удалить Order
, которые не имеют OrderDetail
:
var orders = allPendingOrdersCopy.Where(o => o.OrderDetails.Any())
Я бы хотел более элегантное решение ...
Есть идеи?