es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lea manualmente ODataQueryOptions desde HttpContext.

Quizás alguien pueda ayudarme. Actualmente uso NSwag (https://github.com/RicoSuter/NSwag) para la especificación de la API y la generación de código de cliente para mi API. Y debido a esto, no puedo usar el tipo ODataQueryOptions en mis métodos de controlador sin muchas desventajas.

Actualmente he creado una solución basada en expresiones para admitir una llamada agradable desde el cliente completamente basada en la cadena de filtro Odata.

Entonces, actualmente el cliente puede usar la API generada y hacer una llamada como esta

La solicitud en este ejemplo es entonces una llamada http como esta /api/v1/Brands/?$filter=Name eq ‘Samsung’

Y en el lado del servidor, actualmente creo una expresión real a partir de ella y la filtro en la base de datos y esto funciona bien. Y debido a que todo el controlador tiene [EnableQuery], todos los demás parámetros de Odata como $select, $orderby y así sucesivamente se ejecutan en la memoria en IEnumerable<> y esto es algo que quiero cambiar porque tengo algunos resultados envueltos para paginar, por ejemplo y también no me gusta la mezcla de esto.

Y si creo el método del controlador así

entonces el parámetro ODataQueryOptions se rellena correctamente y puedo cambiar mi consulta Mediator y trabajar con ella, pero el código generado es horrible y también el proyecto del cliente actualmente no tiene una referencia al paquete OData y necesito establecer [ApiExplorerSettings(IgnoreApi = true)] para probarlo actualmente.

Ahora estoy buscando una forma de hacer lo que sea que el enlazador de modelo OData esté haciendo para acceder directamente a ODataQueryOptions desde HttpContext o Request pero no puedo encontrar una manera.

Larga historia corta. Espero que alguien entienda mi problema y pueda ayudarme o darme una buena idea.

Supongo que debería ser de alguna manera posible hacer algo como esto, pero no sé cómo.

public static ODataQueryOptions ReadODataQueryOptions(this HttpRequest request)
{
// No lo sé
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Uso de ODataQueryOptions en métodos de controlador de ASP.NET Core

    El problema descrito por el experto en TI es que no pueden usar el tipo ODataQueryOptions en sus métodos de controlador sin encontrar muchas desventajas, debido a su uso de NSwag para la especificación de API y la generación de código de cliente.

    Han creado una solución usando expresiones para admitir una llamada agradable desde el cliente basada en la cadena de filtro de OData, que funciona bien. Sin embargo, debido a que todo el controlador tiene [EnableQuery], todos los demás parámetros de OData como $ select, $ orderby, etc. se ejecutan en memoria en IEnumerable <>, lo que no es ideal.

    Para resolver este problema, desean acceder a ODataQueryOptions<branddto> directamente desde HttpContext o Request, pero no saben cómo hacerlo.

    Una posible solución es crear un método de extensión para HttpRequest que lea las opciones de consulta de OData y las devuelva como una instancia de ODataQueryOptions<t>. Aquí hay un ejemplo de implementación:

    “`C#
    public static ODataQueryOptions ReadODataQueryOptions(this HttpRequest request)
    {
    var odataOptions = new ODataQueryOptions
    (new ODataQueryContext(ODataModelBuilder.GetEdmModel(), typeof (T)), request.Query);
    return odataOptions;
    }


    Este método crea una nueva instancia de `ODataQueryOptions<t>` utilizando el contexto de consulta de OData y la cadena de consulta de la solicitud. Para usar este método de extensión en un método de controlador, simplemente llámelo en el objeto `HttpRequest`: ```C# [Authorize(Policy = Permissions.Brands.View)] [HttpGet] [Produces(typeof(IQueryable<branddto>))] public async Task<iactionresult> GetAll(CancellationToken cancellationToken = default) { var odataOptions = Request.ReadODataQueryOptions<branddto>(); var brands = await Mediator.Send(new GetAllBrandsQuery(odataOptions), cancellationToken); return Ok(brands); }

    En este ejemplo, se llama al método ReadODataQueryOptions en el objeto Solicitud para obtener las opciones de consulta de OData. Luego se pasan estas opciones al constructor de GetAllBrandsQuery para filtrar los resultados en función de la cadena de consulta de OData.

    Este enfoque permite al experto en TI usar ODataQueryOptions en sus métodos de controlador sin tener que lidiar con las desventajas de NSwag y [EnableQuery], y sin necesidad de hacer referencia al paquete OData en el proyecto de cliente.

Comments are closed.