コード例 #1
0
        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);
        }
コード例 #2
0
        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();
            }
        }