public async Task <ICollection <NestedCategoryWithProductsDetailsModel> > GetAllNested(int numberOfProductsPerCategory, bool includeBlockedProducts = false) { ICollection <NestedCategoryWithProductsDetailsModel> result = this.db.Categories .ProjectTo <NestedCategoryWithProductsDetailsModel>() .OrderBy(c => c.Place) .ToList(); ICollection <Product> products = this.db.Products.Include(p => p.CategoryProducts).Include(p => p.SubcategoryProducts).ToList(); if (!includeBlockedProducts) { products = products.Where(p => p.IsBlocked == false).ToList(); } ICollection <Subcategory> subcategories = this.db.Subcategories.ToList(); foreach (Product product in products) { ProductDetailsModel productModel = await this.products.Get(product.Id); NestedCategoryWithProductsDetailsModel category = result .Where(ncdm => ncdm.Id == product.CategoryProducts.FirstOrDefault() .CategoryId) .FirstOrDefault(); if (category == null) { continue; } category.Count++; category.Products.Add(productModel); if (product.SubcategoryProducts.Any()) { string scId = product.SubcategoryProducts.FirstOrDefault().SubcategoryId; if (!category.Subcategories.Any(c => c.Id == scId)) { Subcategory sc = subcategories.FirstOrDefault(c => c.Id == scId); category.Subcategories.Add(new Models.Subcategory.NestedSubcategoryDetailsModel { Id = sc.Id, Name = sc.Name, Count = 0 }); } category.Subcategories.FirstOrDefault(sc => sc.Id == scId).Count++; } } foreach (var category in result) { await this.AddProducts(category, numberOfProductsPerCategory, includeBlockedProducts); } return(result); }
private async Task AddProducts(NestedCategoryWithProductsDetailsModel category, int numberOfProductsPerCategory, bool includeBlockedProducts) { Dictionary <string, int> productPlaces = this.db.CategoryProducts .Where(cp => cp.CategoryId == category.Id) .Select(c => new { c.ProductId, c.Place }) .ToDictionary(c => c.ProductId, c => c.Place); category.Products = category.Products .Select(cp => { return(new { product = cp, place = productPlaces[cp.Id] }); }) .OrderBy(p => p.place) .Take(numberOfProductsPerCategory) .Select(p => p.product) .ToList(); if (!includeBlockedProducts) { category.Products = category.Products.Where(p => p.IsBlocked == false).ToList(); } }