ASP.net Core APP 02 – Pesquisa por produtos

O próximo passo é permitir que os usuários do nosso site utilizem a caixa de busca para procurar por produtos pela descrição dentro do banco de dados. Para isso vamos alterar nossa interface IProductService para incluir um novo método chamado GetAllByName(string name);

using System.Collections.Generic;
using myshop.Models;

namespace myshop.Services
{
    public interface IProductService
    {
         List<Product> GetAll();
         List<Product> GetAllByName(string name);
    }
}

Agora devemos implementar o mesmo método dentro da classe ProductService para utilizando o Linq e uma instrução lambda, realizar a consulta no banco de dados Mongo mas filtrando pelo nome do produto.

using System;
using System.Collections.Generic;
using MongoDB.Driver;
using myshop.Models;

namespace myshop.Services
{
    public class ProductService : IProductService
    {
        MongoClient con;
        IMongoDatabase db;
        public ProductService()
        {
            con = new MongoClient("mongodb://172.18.0.35:27017");
            db = con.GetDatabase("dbwalter");
            if(db.GetCollection<Product>("Products") == null)
                db.CreateCollection("Products");
        }
        public List<Product> GetAll()
        {
            var collection = db.GetCollection<Product>("Products");
            return collection.Find<Product>(p => true).ToList();
        }
        public List<Product> GetAllByName(string name){
            var collection = db.GetCollection<Product>("Products");
            return collection.Find<Product>(p => p.Name.ToLower().Contains(name.ToLower())).ToList();
        }
    }
}

Então devemos modificar o código da nossa classe controller HomeController para que o método action Index receba um parâmetro chamado search do tipo String. Caso esse parâmetro possua valor, o novo método de consulta no banco deve ser executado:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using myshop.Models;
using myshop.Services;

namespace myshop.Controllers
{
    public class HomeController : Controller
    {
        private IProductService productService;
        public HomeController(IProductService productService)
        {
            this.productService = productService;
        }

        public IActionResult Index(String search)
        {
            IList<Product> listProducts = null;
            if(search == null){
                listProducts = productService.GetAll();
            }else{
                listProducts = productService.GetAllByName(search);
            }
            return View(listProducts);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

Para concluir devemos modificar o código do arquivo Views -> Home -> Index.cshtml para no campo de busca realizar a chamada da action index do HomeController através de um formulário. Observe que alteramos o tag input para colocar o name=”search” que é o nome do parâmetro que a action Index espera.

<div class="col-lg-6 col-sm-8">
			@using (Html.BeginForm("Index","Home")){
				<div class="input-group w-100">
				    <input type="text" class="form-control" style="width:55%;" 
						placeholder="1" name="search">
				    <!--<select class="custom-select"  name="category_name">
							<option value="">All type</option><option value="codex">Special</option>
							<option value="comments">Only best</option>
							<option value="content">Latest</option>
					</select>!-->
				    <div class="input-group-append">
				      <button class="btn btn-primary" type="submit">
				        <i class="fa fa-search"></i>
				      </button>
				    </div>
			    </div>
			}
	</div> <!-- col.// -->

Agora execute a aplicação utilizando o comando dotnet run e utilize o campo de busca para fazer a consulta.