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.AspNet.OData.

Agregamos nuestro contructor para recibir el contexto y nuestro objeto para traducir los mensjaes 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.

ClientesController.cs
using CaducaRest.Models;
using CaducaRest.Resources;
using Microsoft.AspNet.OData;
using Microsoft.AspNetCore.Mvc;
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 reealizar 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:

ClientesController.cs
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();
}