public async Task <OrderPostAllResponse> PostAll(ApplicationUser currentUser, OrderPostAllRequest request) { var response = new OrderPostAllResponse(); var query = _fuelContext.Orders.AsQueryable(); if (request.Numbers != null && request.Numbers.Any()) { query = query.Where(x => request.Numbers.Contains(x.Number)); } var queryOrderIds = query.Select(x => x.Id); if (request.Statuses != null && request.Statuses.Any()) { // узнаем последние статусы у заказов, полученных на предыдущем шаге var lastStatuses = await _fuelContext.StatusHistory .Where(x => queryOrderIds.Contains(x.OrderId)) .GroupBy(x => x.OrderId) .SelectMany(x => x.OrderByDescending(t => t.ChangeTime).Take(1)) .Where(x => request.Statuses.Contains((OrderStatusVM)x.Status)) .ToListAsync(); queryOrderIds = lastStatuses.Select(x => x.OrderId).AsQueryable(); query = query.Where(x => lastStatuses.Any(t => t.OrderId == x.Id)); } if (request.BeginDate.HasValue) { var beginDateDetalizations = await _fuelContext.ClientDetalizations .Where(x => queryOrderIds.Contains(x.OrderId) && x.CreationDate >= request.BeginDate.Value) .ToListAsync(); queryOrderIds = beginDateDetalizations.Select(x => x.OrderId).AsQueryable(); query = query.Where(x => beginDateDetalizations.Any(t => t.OrderId == x.Id)); } if (request.EndDate.HasValue) { var endDateDetalizations = await _fuelContext.ClientDetalizations .Where(x => queryOrderIds.Contains(x.OrderId) && x.CreationDate <= request.EndDate.Value) .ToListAsync(); queryOrderIds = endDateDetalizations.Select(x => x.OrderId).AsQueryable(); query = query.Where(x => endDateDetalizations.Any(t => t.OrderId == x.Id)); } var orders = await query.ToListAsync(); if (!orders.Any()) { response.AddMessage(Common.BaseResponseResources.MessageType.INFO, _stringLocalizer[CustomStringLocalizer.ORDERS_NOT_FOUND]); return(response); } var ordersVM = new List <OrderVM>(); foreach (var order in orders) { var clientDetalization = await _fuelContext.ClientDetalizations.FirstOrDefaultAsync(x => x.OrderId == order.Id); var driverDetalizations = await GetDriverDetalizationsAsync(order.Id); var statusHistories = await GetStatusHistoryAsync(order.Id); var item = Convert(order, clientDetalization, driverDetalizations, statusHistories); ordersVM.Add(item); } response.Items = ordersVM; return(response); }
public async Task <OrderPostAllResponse> PostAll([FromBody] OrderPostAllRequest request) { var currentUser = await _userManager.GetUserAsync(User); return(await _orderModel.PostAll(currentUser, request)); }