//Get: /Search?querystring...
        public async Task <IActionResult> Search(string keyword, string category, string price, int?page)
        {
            ViewData["keyword"]  = keyword;
            ViewData["category"] = category;
            ViewData["price"]    = price;

            if (keyword != null)
            {
                page = 1;
            }

            var query = db.Products.Where(x => x.Published);

            if (!String.IsNullOrEmpty(keyword))
            {
                query = query.Where(p => p.Name.Contains(keyword));
            }

            if (!String.IsNullOrEmpty(category) && category != "all")
            {
                query = query.Where(p => p.category.ToString().ToLower() == category);
            }

            if (!String.IsNullOrEmpty(price) && price != "all")
            {
                switch (price)
                {
                case "lower":
                    query = query.Where(p => p.UnitPrice < 10);
                    break;

                case "1":
                    query = query.Where(p => p.UnitPrice >= 10 && p.UnitPrice < 50);
                    break;

                case "2":
                    query = query.Where(p => p.UnitPrice >= 50 && p.UnitPrice < 100);
                    break;

                case "higher":
                    query = query.Where(p => p.UnitPrice >= 100);
                    break;
                }
                query = query.OrderBy(p => p.UnitPrice);
            }

            var items = query.Select(p => new ShopItem {
                Name  = p.Name,
                Price = p.UnitPrice,
                Image = p.FirstImage(),
                Id    = p.Id
            });
            var model = await PagingList <ShopItem> .CreateAsyn(items.AsNoTracking(), page ?? 1, 4);

            return(View(model));
        }