public virtual async Task <DeliveryChargeDto> CalculateAsync(int addressId, int deliveryScheduleId, CartItemDto[] items) { var meanDistance = await DeliveryChargeRepository.GetMeanDistanceAsync(addressId); var distanceChargeE = await AsyncExecuter .LastOrDefaultAsync(from dcR in DistanceChargeRepository orderby dcR.From ascending where dcR.From <= meanDistance.MeanDistance select dcR); _ = distanceChargeE ?? throw new BusinessException(); var subtotal = 0.0; foreach (var ci in items) { var itemE = await ItemRepository.SingleOrDefaultAsync(e => e.Id == ci.ItemID) ?? throw new BusinessException(); subtotal += itemE.ItemPrice * ci.Qty; } var subtotalPerE = await AsyncExecuter .LastOrDefaultAsync(from subPR in SubtotalPercentageRepository orderby subPR.From ascending where subPR.From <= subtotal select subPR); var itemIdsArr = items.Select(e => e.ItemID).ToArray(); var dsArr = await DeliveryScheduleRepository.GetCompatibleSchedules((new Guid()), addressId, itemIdsArr); var dsE = dsArr.SingleOrDefault(e => e.Id == deliveryScheduleId) ?? throw new BusinessException(); float dsCost = (float)(subtotal * (dsE.CostIncreasePercentage / 100)); var subPer = (subtotalPerE == null)? 0 : (subtotal * ((float)subtotalPerE.Percentage / 100)); return(new DeliveryChargeDto { DistanceChargeID = distanceChargeE.Id, DeliveryScheduleID = dsE.Id, SubtotalPercentageID = (subtotalPerE == null)? 0 : subtotalPerE.Id, DistanceCharge = distanceChargeE.Charge, IncreasedCost = dsCost, SubtotalPercentage = (float)subPer, Subtotal = (float)subtotal, Nettotal = (float)(subtotal + distanceChargeE.Charge + dsCost + subPer) }); }