Feature load improvement (#374)

* use lambda expression  => improve database call

* use lambda instead  for each replace call to repository to reduce call to database

* improve readability and maintainability, and add order by

* clean semicolon

* fix use correct catalog item id
This commit is contained in:
Cédric Michel
2020-05-13 19:45:52 +02:00
committed by GitHub
parent 2d08fa4090
commit 92ca22cf8b
4 changed files with 69 additions and 46 deletions

View File

@@ -1,11 +1,11 @@
using Microsoft.eShopWeb.ApplicationCore.Interfaces; using Ardalis.GuardClauses;
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate;
using System.Threading.Tasks;
using Microsoft.eShopWeb.ApplicationCore.Entities; using Microsoft.eShopWeb.ApplicationCore.Entities;
using System.Collections.Generic;
using Ardalis.GuardClauses;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.ApplicationCore.Specifications;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopWeb.ApplicationCore.Services namespace Microsoft.eShopWeb.ApplicationCore.Services
{ {
@@ -33,14 +33,18 @@ namespace Microsoft.eShopWeb.ApplicationCore.Services
var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec); var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);
Guard.Against.NullBasket(basketId, basket); Guard.Against.NullBasket(basketId, basket);
var items = new List<OrderItem>();
foreach (var item in basket.Items) var catalogItemsSpecification = new CatalogItemsSpecification(basket.Items.Select(item => item.CatalogItemId).ToArray());
var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);
var items = basket.Items.Select(basketItem =>
{ {
var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId); var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri)); var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri));
var orderItem = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity); var orderItem = new OrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
items.Add(orderItem); return orderItem;
} }).ToList();
var order = new Order(basket.BuyerId, shippingAddress, items); var order = new Order(basket.BuyerId, shippingAddress, items);
await _orderRepository.AddAsync(order); await _orderRepository.AddAsync(order);

View File

@@ -0,0 +1,14 @@
using Microsoft.eShopWeb.ApplicationCore.Entities;
using System;
using System.Linq;
namespace Microsoft.eShopWeb.ApplicationCore.Specifications
{
public class CatalogItemsSpecification : BaseSpecification<CatalogItem>
{
public CatalogItemsSpecification(params int[] ids) : base(c => ids.Contains(c.Id))
{
}
}
}

View File

@@ -5,6 +5,7 @@ using Microsoft.eShopWeb.ApplicationCore.Specifications;
using Microsoft.eShopWeb.Web.Interfaces; using Microsoft.eShopWeb.Web.Interfaces;
using Microsoft.eShopWeb.Web.Pages.Basket; using Microsoft.eShopWeb.Web.Pages.Basket;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.eShopWeb.Web.Services namespace Microsoft.eShopWeb.Web.Services
@@ -38,10 +39,13 @@ namespace Microsoft.eShopWeb.Web.Services
private async Task<BasketViewModel> CreateViewModelFromBasket(Basket basket) private async Task<BasketViewModel> CreateViewModelFromBasket(Basket basket)
{ {
var viewModel = new BasketViewModel(); var viewModel = new BasketViewModel
viewModel.Id = basket.Id; {
viewModel.BuyerId = basket.BuyerId; Id = basket.Id,
viewModel.Items = await GetBasketItems(basket.Items); ; BuyerId = basket.BuyerId,
Items = await GetBasketItems(basket.Items)
};
return viewModel; return viewModel;
} }
@@ -54,27 +58,29 @@ namespace Microsoft.eShopWeb.Web.Services
{ {
BuyerId = basket.BuyerId, BuyerId = basket.BuyerId,
Id = basket.Id, Id = basket.Id,
Items = new List<BasketItemViewModel>()
}; };
} }
private async Task<List<BasketItemViewModel>> GetBasketItems(IReadOnlyCollection<BasketItem> basketItems) private async Task<List<BasketItemViewModel>> GetBasketItems(IReadOnlyCollection<BasketItem> basketItems)
{ {
var items = new List<BasketItemViewModel>(); var catalogItemsSpecification = new CatalogItemsSpecification(basketItems.Select(b => b.CatalogItemId).ToArray());
foreach (var item in basketItems) var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);
var items = basketItems.Select(basketItem =>
{ {
var itemModel = new BasketItemViewModel var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
var basketItemViewModel = new BasketItemViewModel
{ {
Id = item.Id, Id = basketItem.Id,
UnitPrice = item.UnitPrice, UnitPrice = basketItem.UnitPrice,
Quantity = item.Quantity, Quantity = basketItem.Quantity,
CatalogItemId = item.CatalogItemId CatalogItemId = basketItem.CatalogItemId,
PictureUrl = _uriComposer.ComposePicUri(catalogItem.PictureUri),
ProductName = catalogItem.Name
}; };
var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId); return basketItemViewModel;
itemModel.PictureUrl = _uriComposer.ComposePicUri(catalogItem.PictureUri); }).ToList();
itemModel.ProductName = catalogItem.Name;
items.Add(itemModel);
}
return items; return items;
} }

View File

@@ -82,14 +82,13 @@ namespace Microsoft.eShopWeb.Web.Services
_logger.LogInformation("GetBrands called."); _logger.LogInformation("GetBrands called.");
var brands = await _brandRepository.ListAllAsync(); var brands = await _brandRepository.ListAllAsync();
var items = new List<SelectListItem> var items = brands
{ .Select(brand => new SelectListItem() { Value = brand.Id.ToString(), Text = brand.Brand })
new SelectListItem() { Value = null, Text = "All", Selected = true } .OrderBy(b => b.Text)
}; .ToList();
foreach (CatalogBrand brand in brands)
{ var allItem = new SelectListItem() { Value = null, Text = "All", Selected = true };
items.Add(new SelectListItem() { Value = brand.Id.ToString(), Text = brand.Brand }); items.Insert(0, allItem);
}
return items; return items;
} }
@@ -98,14 +97,14 @@ namespace Microsoft.eShopWeb.Web.Services
{ {
_logger.LogInformation("GetTypes called."); _logger.LogInformation("GetTypes called.");
var types = await _typeRepository.ListAllAsync(); var types = await _typeRepository.ListAllAsync();
var items = new List<SelectListItem>
{ var items = types
new SelectListItem() { Value = null, Text = "All", Selected = true } .Select(type => new SelectListItem() { Value = type.Id.ToString(), Text = type.Type })
}; .OrderBy(t => t.Text)
foreach (CatalogType type in types) .ToList();
{
items.Add(new SelectListItem() { Value = type.Id.ToString(), Text = type.Type }); var allItem = new SelectListItem() { Value = null, Text = "All", Selected = true };
} items.Insert(0, allItem);
return items; return items;
} }