7.1.6 Creando el Controller para clientes
Agregamos un nuevo controlador de Api en blanco y lo llamamos ClientesController este hereda de la clase ODataController que esta en el espacio de nombres Microsoft.AspNetCore.OData.Routing.Controllers.
Agregamos nuestro constructor para recibir el contexto y nuestro objeto para traducir los mensajes de error.
Agregamos nuestros servicios get y agregamos la opción [EnableQuery] la cual nos permitirá acceder a los datos de los clientes de acuerdo a las reglas de OData.
Para que filtren adecuadamente los servicios por Id el parámetro debe llamarse key.
using CaducaRest.Core;
using CaducaRest.DAO;
using CaducaRest.Models;
using CaducaRest.Resources;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.OData.Formatter;
using Microsoft.AspNetCore.OData.Query;
using Microsoft.AspNetCore.OData.Routing.Controllers;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace CaducaRest.Controllers;
public class ClientesController : ODataController
{
private readonly LocService _localizer;
private readonly CaducaContext _context;
public ClientesController(CaducaContext context,
LocService localizer)
{
_context = context;
_localizer = localizer;
}
[EnableQuery]
public IActionResult Get()
{
var clientes = _context.Cliente;
return Ok(clientes);
}
[EnableQuery]
public IActionResult Get([FromODataUri]int key)
{
return Ok(_context.Cliente.Find(key));
}
}
Podemos agregar directamente en nuestra base de datos algunos registros de cliente para poder realizar el filtrado con OData.
Selecionar solamente unos campos
Probamos con postman seleccionar solamente la clave y nombre del cliente con el parámetro $select seguido de los campos separados por coma que deseas. Para ordenar por algún campo puedes usar el parámetro $orderby seguido del campo y desc si quieres ordenar en forma descendente.
http://localhost:5000/odata/Clientes?$select=Clave,NombreComercial,RazonSocial&$orderBy=RazonSocial desc

Filtrar los clientes
Puedes filtrar por cualquier campo de la tabla con $filter luego el nombre del campo por el cual deseas filtrar por ejemplo eq para igual y por último entre ' el nombre que deseas buscar. En este ejemplo deseo buscar los clientes cuya dirección es igual a Conocido.
http://localhost:50685/odata/Clientes?$filter=Direccion
eq 'Conocido'&$orderBy=Clave desc

La lista de opciones disponibles es:
Condición
Descripción
Ejemplo
eq
Igual a
$filter=Direccion eq 'Conocido'
ne
Diferente
$filter=Clave ne 1
gt
Mayor a
$filter=Id gt 4
ge
Mayor o igual a
$filter=Clave ge 5
lt
Menor que
$filter=Id lt 10
le
Menor o igual que
$filter=Clave le 5
and
Y lógico
$filter=Clave ge 5 and Activo eq true
or
O lógico
$filter=Clave gt 5 or Activo eq true
not
No
$filter=not startswith(RazonSocial,'Farmacia')
Para buscar un cliente agregando entre paréntesis el id y puedes agregar los parámetros para seleccionar solo algunos campos.
http://localhost:5000/odata/Clientes(5)?$select=Clave,NombreComercial

Los servicios para agregar, modificar y borrar se realizan de la misma manera. El código final queda de la siguiente manera:
public class ClientesController : ODataController
{
private readonly LocService _localizer;
private readonly CaducaContext _context;
private ClienteDAO clienteDAO;
public ClientesController(CaducaContext context,
LocService localizer)
{
_context = context;
_localizer = localizer;
clienteDAO = new ClienteDAO(_context, _localizer);
}
[EnableQuery]
public IActionResult Get()
{
var clientes = _context.Cliente;
return Ok(clientes);
}
[EnableQuery]
public ActionResult<IQueryable<ClienteCategoria>> GetCliente([FromODataUri] int key)
{
return Ok(_context.Cliente.Where(c => c.Id == key));
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] Cliente cliente)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
List<IRegla> reglas = new List<Core.IRegla>();
await clienteDAO.AgregarAsync(cliente);
return Ok(cliente);
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete([FromRoute] int id)
{
if (!await clienteDAO.BorraAsync(id))
{
return StatusCode(clienteDAO.customError.StatusCode,
clienteDAO.customError.Message);
}
return Ok();
}
Last updated
Was this helpful?