8.1.2 Creando el query

Los objetos query nos van a permitir consultar la información de nuestros servicios.

Para poder realizar el filtrado con graphql se debe regresar un IQueryable por lo cual vamos a agregar una función ObtenerIQueryable en nuestra clase AccesoDAO

AccesoDAO.cs
/// <summary>
/// Regresa todos los registros como IQueryable
/// </summary>
/// <returns></returns>
public IQueryable<TEntity> ObtenerIQueryable()
{
    return contexto.Set<TEntity>();
}

Creando CaducidadDAO

Vamos a crear la clase para obtener los datos de las caducidades, con todas las funciones básicas.

CaducidadDAO.cs
public class CaducidadDAO
{
    private readonly CaducaContext contexto;
    private readonly LocService localizacion;

    private readonly AccesoDAO<Caducidad> caducidadDAO;

    public CustomError customError;

    public CaducidadDAO(CaducaContext context, LocService locService)
    {
        this.contexto = context;
        this.localizacion = locService;
        caducidadDAO = new AccesoDAO<Caducidad>(context, locService);
    }

    public async Task<List<Caducidad>> ObtenerTodoAsync()
    {
         return await caducidadDAO.ObtenerTodoAsync();
    }

    public List<Caducidad> ObtenerTodo()
    {
        return caducidadDAO.ObtenerTodo();
    }
    
    public async Task<Caducidad> ObtenerPorIdAsync(int id)
    {
         return await caducidadDAO.ObtenerPorIdAsync(id);
    }

    public async Task<bool> AgregarAsync(Caducidad caducidad)
    {
         List<IRegla> reglas = new List<Core.IRegla>();
         if (await caducidadDAO
                 .AgregarAsync(caducidad, reglas))
             return true;
         else
         {
             customError = caducidadDAO.customError;
             return false;
         }
    }
      
    public async Task<bool> ModificarAsync(Cliente cliente)
    {
        List<IRegla> reglas = new List<Core.IRegla>();
        if (await clienteDAO.ModificarAsync(cliente, reglas))
                return true;
        else
        {
                customError = clienteDAO.customError;
                return false;
        
        }
    }

    public async Task<bool> BorraAsync(int id)
    {
        var caducidad = await ObtenerPorIdAsync(id);
        if (caducidad == null)
        {
            customError = new CustomError(404, String.
                Format(this.localizacion
                  .GetLocalizedHtmlString("NotFound"), 
                  "La Caducidad"), "Id");
            return false;
        }
        contexto.Caducidad.Remove(caducidad);
        await contexto.SaveChangesAsync();
        return true;
    }
    
    public IQueryable<Caducidad> ObtenerIQueryable()
    {
        return caducidadDAO.ObtenerIQueryable();
    }
}

Creando nuestro Objeto Query

Vamos a crear nuestro objeto Query el cual contiene todos los servicios que vamos a exponer de consulta. Crearé una carpeta GraphQL y dentro una carpeta HotChocolate (para diferenciar con la otra librería de grapqhl)

Agrega una función GetCaducidad que reciba como parámetro el contexto en este caso es CaducaContext con el atributo [Service] el cual realizará el dependency injection y también el LocService para los mensajes de error

Por último agregamos nuestra clase CaducidadDAO y llamamos a la función ObtenerIQueryable.

Para poder seleccionar solo algunos campos de la tabla agregamos [UseProjection]

Para filtrar información agregamos [UseFiltering] y agregamos [UseSorting] para ordenar

Query.cs
using System.Linq;
using CaducaRest.DAO;
using CaducaRest.Models;
using CaducaRest.Resources;
using HotChocolate;
using HotChocolate.Data;
using HotChocolate.Types;

namespace CaducaRest.GraphQL.HotChocolate;

/// <summary>
/// Querys for grapqhl
/// </summary>
public class Query
{
    [UseProjection]
    [UseFiltering]
    [UseSorting]
    public IQueryable<Caducidad> GetCaducidad([Service] CaducaContext caducaContext, 
                                              [Service] LocService locService) 
    {
        CaducidadDAO caducidadDAO = new CaducidadDAO(caducaContext, locService);
        return caducidadDAO.ObtenerIQueryable();
    }
}

Puedes ver a continuación el link oficial https://chillicream.com/docs/hotchocolate/get-started

También puedes ver la dotneconf donde se ve una introducción

https://www.youtube.com/watch?v=GBvTRcV4PVA&list=PLdo4fOcmZ0oVFtp9MDEBNbA2sSqYvXSXO&index=29

Last updated