Entity Framework - SQL força por bruta

Nesta aula iremos utilizar o Entity Framework de uma forma diferente, pensando fora da caixa veremos várias formas de trazer uma visualização de dados por inner join.

assinaturaAssine nossa Comunidade

Entity Framework - SQL força bruta

O objetivo desta aula é usar o Entity Framework para fazer o SQL com força bruta, ou seja, como podemos usar um select/from/tabela retornando um dado totalmente customizado que será mostrado em uma view.

Iremos mostrar várias formas de como vocês podem utilizar o Entity Framework para cumprir esse objetivo, pois muitas vezes no seu trabalho as coisas não irão vir da mesma forma quando você faz um scaffold ou um generator. As vezes precisamos mostrar um relatório que possui campos que se juntam com outras tabelas.

E como fazer o inner join no Entity framework,pois no SQL Server sabemos fazer o inner join e como mostraremos isso na view. Então mostraremos para vocês

Neste exemplo teremos a estrutura dos Modelos abaixo:

  • Cliente
  • Produto
  • Pedido
  • PedidoProduto

O projeto possui os controllers:

  • ClientesCntroller.cs
  • HomeController.cs
  • PedidoProdutosController.cs
  • PedidosController.cs
  • ProdutosController.cs

Mostrar nome do cliente através do include

Agora iremos trazer na view Pedido o Nome do Cliente, ao invés do id.

Primeiro temos que inserir a propriedade de Cliente no modelo Pedido:

      
       [Required] 
       [Column("IdCliente")]
       public int ClienteId { get; set; }
       
       public Cliente Cliente { get; private set; }
       
       
    

Em PedidosController, no contexto de pedidos, precisaremos incluir a busca do modelo chamado Cliente. Para isso utilizaremos o Include e assim o nome do cliente será mostrado na view.

      
      public async Task< IActionResult> Index() 
      {
        var lista = await _context.Pedidos.Include(p=> p.Cliente).ToListAsync();
        return View(lista);
      }
       
    

Mostrar nome do cliente através do Lazy load

Outra maneira de imprimir o nome o cliente seria por Lazy Load:

  • Na pasta Database->Repositorios, criaremos um arquivo ClienteRepositorio.cs
  •         
            public class ClienteRepositorio 
            {
              public ClienteRepositorio(){
                this.contexto = new ContextoLoja1();
              }
              private ContextoLoja1 contexto;
    
              public Cliente BuscaClientePorId(int id) {
                return contexto.Clientes.Find(id);
              }
            }
             
          
  • A propriedade cliente do modelo Pedido ficará da seguinte forma:
  •         
            [Required] 
            [Column("IdCliente")]
            public int ClienteId { get; set; }
            
            public Cliente Cliente { 
              get
              {
                return new ClienteRepositorio
              }
            
             
          

Mostrar nome do cliente através de SQL força bruta.

Vamos alterar a Index em PedidosController para que possamos inserir diretamente a instrução SQL que queremos mostrar na view:

      
      public async Task< IActionResult> Index() 
      {
        return View(_context,Pedidos.FromSqlRaw("Select \"Id\", \"IdCliente\", \"Valor\", \"Data\" 
                                                FROM \"Pedidos\"").Include(p=>p.CLiente).ToList());
      }
       
    

Mostrar nome do cliente através objetos encadeados.

Criaremos um record de Pedido:

      
        namespace aula_youtube_tabelas_query_bruta.Models.Dominio.Views 
        {
          public record Pedido
          {
            public int Id { get; set;}
            public string Cliente { get; set;}
            public double Valor { get; set;}
            public DateTime Data { get; set;}
      
          } 
        }
       
    

Vamos alterar a Index em PedidosController para retornar o record na View:

      
      public async Task< IActionResult> Index() 
      {
        var lista = await _context.Clientes.Join( 
          _context.Pedidos,
          cliente => cliente.Id,
          pedido => pedido.ClienteId,
          (cliente,pedido) => new Models.Dominio.Views.Pedido 
          {
            Id = pedido.Id,
            Cliente = cliente.Nome,
            Data = pedido.Data,
            Valor = pedido.Valor
          }
        ).ToListAsync();

        return View(lista);
      }
       
    

Na View, arquivo Index.cshtml, iremos fazer a referência de Models.Dominio.Views.Pedido

      
        @model IEnumerable< aula_youtube_tabelas_query_bruta.Models.Dominio.Views.Pedido> 
        @{
          ViewData["Title"] =  "Index";
        } 
        < h1>Lista de pedidos< /h1>

        < table class = "table"> 
        < tr> 
          < th>@Html.DisplayNameFor(model => model.Id) < /th>
          < th>Cliente < /th>
          < th>@Html.DisplayNameFor(model => model.Valor) < /th>
          < th>@Html.DisplayNameFor(model => model.Data) < /th>
          < th> < /th>
        < /tr>

        @foreach (var item in Model) 
        {
          < tr> 
            < td>@item.Id < /td>
            < td>@Html.DisplayFor(modelItem => item.Cliente) < /td>
            < td>@Html.DisplayFor(modelItem => item.Valor) < /td>
            < td>@Html.DisplayFor(modelItem => item.Data) < /td>
        < /tr>

        }

      < /table> 
       
    

Entity Framework - SQL força por bruta

Nesta aula iremos utilizar o Entity Framework de uma forma diferente, pensando fora da caixa veremos várias formas de trazer uma visualização de dados por inner join.

Próximas Aulas:
assinaturaAssine nossa Comunidade

Entity Framework - SQL força bruta

O objetivo desta aula é usar o Entity Framework para fazer o SQL com força bruta, ou seja, como podemos usar um select/from/tabela retornando um dado totalmente customizado que será mostrado em uma view.

Iremos mostrar várias formas de como vocês podem utilizar o Entity Framework para cumprir esse objetivo, pois muitas vezes no seu trabalho as coisas não irão vir da mesma forma quando você faz um scaffold ou um generator. As vezes precisamos mostrar um relatório que possui campos que se juntam com outras tabelas.

E como fazer o inner join no Entity framework,pois no SQL Server sabemos fazer o inner join e como mostraremos isso na view. Então mostraremos para vocês

Neste exemplo teremos a estrutura dos Modelos abaixo:

  • Cliente
  • Produto
  • Pedido
  • PedidoProduto

O projeto possui os controllers:

  • ClientesCntroller.cs
  • HomeController.cs
  • PedidoProdutosController.cs
  • PedidosController.cs
  • ProdutosController.cs

Mostrar nome do cliente através do include

Agora iremos trazer na view Pedido o Nome do Cliente, ao invés do id.

Primeiro temos que inserir a propriedade de Cliente no modelo Pedido:

      
       [Required] 
       [Column("IdCliente")]
       public int ClienteId { get; set; }
       
       public Cliente Cliente { get; private set; }
       
       
    

Em PedidosController, no contexto de pedidos, precisaremos incluir a busca do modelo chamado Cliente. Para isso utilizaremos o Include e assim o nome do cliente será mostrado na view.

      
      public async Task< IActionResult> Index() 
      {
        var lista = await _context.Pedidos.Include(p=> p.Cliente).ToListAsync();
        return View(lista);
      }
       
    

Mostrar nome do cliente através do Lazy load

Outra maneira de imprimir o nome o cliente seria por Lazy Load:

  • Na pasta Database->Repositorios, criaremos um arquivo ClienteRepositorio.cs
  •         
            public class ClienteRepositorio 
            {
              public ClienteRepositorio(){
                this.contexto = new ContextoLoja1();
              }
              private ContextoLoja1 contexto;
    
              public Cliente BuscaClientePorId(int id) {
                return contexto.Clientes.Find(id);
              }
            }
             
          
  • A propriedade cliente do modelo Pedido ficará da seguinte forma:
  •         
            [Required] 
            [Column("IdCliente")]
            public int ClienteId { get; set; }
            
            public Cliente Cliente { 
              get
              {
                return new ClienteRepositorio
              }
            
             
          

Mostrar nome do cliente através de SQL força bruta.

Vamos alterar a Index em PedidosController para que possamos inserir diretamente a instrução SQL que queremos mostrar na view:

      
      public async Task< IActionResult> Index() 
      {
        return View(_context,Pedidos.FromSqlRaw("Select \"Id\", \"IdCliente\", \"Valor\", \"Data\" 
                                                FROM \"Pedidos\"").Include(p=>p.CLiente).ToList());
      }
       
    

Mostrar nome do cliente através objetos encadeados.

Criaremos um record de Pedido:

      
        namespace aula_youtube_tabelas_query_bruta.Models.Dominio.Views 
        {
          public record Pedido
          {
            public int Id { get; set;}
            public string Cliente { get; set;}
            public double Valor { get; set;}
            public DateTime Data { get; set;}
      
          } 
        }
       
    

Vamos alterar a Index em PedidosController para retornar o record na View:

      
      public async Task< IActionResult> Index() 
      {
        var lista = await _context.Clientes.Join( 
          _context.Pedidos,
          cliente => cliente.Id,
          pedido => pedido.ClienteId,
          (cliente,pedido) => new Models.Dominio.Views.Pedido 
          {
            Id = pedido.Id,
            Cliente = cliente.Nome,
            Data = pedido.Data,
            Valor = pedido.Valor
          }
        ).ToListAsync();

        return View(lista);
      }
       
    

Na View, arquivo Index.cshtml, iremos fazer a referência de Models.Dominio.Views.Pedido

      
        @model IEnumerable< aula_youtube_tabelas_query_bruta.Models.Dominio.Views.Pedido> 
        @{
          ViewData["Title"] =  "Index";
        } 
        < h1>Lista de pedidos< /h1>

        < table class = "table"> 
        < tr> 
          < th>@Html.DisplayNameFor(model => model.Id) < /th>
          < th>Cliente < /th>
          < th>@Html.DisplayNameFor(model => model.Valor) < /th>
          < th>@Html.DisplayNameFor(model => model.Data) < /th>
          < th> < /th>
        < /tr>

        @foreach (var item in Model) 
        {
          < tr> 
            < td>@item.Id < /td>
            < td>@Html.DisplayFor(modelItem => item.Cliente) < /td>
            < td>@Html.DisplayFor(modelItem => item.Valor) < /td>
            < td>@Html.DisplayFor(modelItem => item.Data) < /td>
        < /tr>

        }

      < /table>