Фильтрация заказов по ProviderID OrderDetail с использованием linq - PullRequest
0 голосов
/ 20 марта 2019

В моем приложении я разрешаю пользователю заказывать Food товаров у разных поставщиков.Таким образом, Order может иметь OrderDetail элементов, поступающих от разных провайдеров .

Зная ProviderID, как я могу получить только заказов , которые имеют наминимум 1 'OrderDetail' из указанного ProviderID.

Я хочу упростить свое решение:

  1. Сначала я получу все FoodID поставщика

    List<int> providersFoodIDs = db.Foods .Where(f => f.Availability && f.ProviderID == providerID) .Select(f => f.FoodID).ToList();

  2. Получение заказов

    List<Order> allPendingOrders = db.Orders .Where(o => o.Status == Enums.OrderStatus.Pending.ToString()) .Include(o => o.OrderDetails) .ToList();

  3. Копия заказов:

    List<Order> allPendingOrdersCopy = db.Orders.AsNoTracking() .Where(o => o.Status == Enums.OrderStatus.Pending.ToString()) .Include(o => o.OrderDetails) .ToList();

  4. Зациклить исходную коллекцию заказов, и если 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> }

  5. Удалить Order, которые не имеют OrderDetail:

    var orders = allPendingOrdersCopy.Where(o => o.OrderDetails.Any())

Я бы хотел более элегантное решение ...

Есть идеи?

...