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:
@@ -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);
|
||||||
|
|||||||
@@ -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))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ namespace Microsoft.eShopWeb.Web.Services
|
|||||||
// the implementation below using ForEach and Count. We need a List.
|
// the implementation below using ForEach and Count. We need a List.
|
||||||
var itemsOnPage = await _itemRepository.ListAsync(filterPaginatedSpecification);
|
var itemsOnPage = await _itemRepository.ListAsync(filterPaginatedSpecification);
|
||||||
var totalItems = await _itemRepository.CountAsync(filterSpecification);
|
var totalItems = await _itemRepository.CountAsync(filterSpecification);
|
||||||
|
|
||||||
var vm = new CatalogIndexViewModel()
|
var vm = new CatalogIndexViewModel()
|
||||||
{
|
{
|
||||||
CatalogItems = itemsOnPage.Select(i => new CatalogItemViewModel()
|
CatalogItems = itemsOnPage.Select(i => new CatalogItemViewModel()
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user