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.
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:
O projeto possui os controllers:
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);
}
Outra maneira de imprimir o nome o cliente seria por Lazy Load:
public class ClienteRepositorio
{
public ClienteRepositorio(){
this.contexto = new ContextoLoja1();
}
private ContextoLoja1 contexto;
public Cliente BuscaClientePorId(int id) {
return contexto.Clientes.Find(id);
}
}
[Required]
[Column("IdCliente")]
public int ClienteId { get; set; }
public Cliente Cliente {
get
{
return new ClienteRepositorio
}
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());
}
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>
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.
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:
O projeto possui os controllers:
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);
}
Outra maneira de imprimir o nome o cliente seria por Lazy Load:
public class ClienteRepositorio
{
public ClienteRepositorio(){
this.contexto = new ContextoLoja1();
}
private ContextoLoja1 contexto;
public Cliente BuscaClientePorId(int id) {
return contexto.Clientes.Find(id);
}
}
[Required]
[Column("IdCliente")]
public int ClienteId { get; set; }
public Cliente Cliente {
get
{
return new ClienteRepositorio
}
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());
}
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>