Search code examples
asp.net-coreodata

Odata asp.net core 2.2 web api pagination


Is there any way to handle page size from the query parameter sent by the client. And not as default in the code as Enablequery(Pagesize = 100)


Solution

  • Is there any way to handle page size from the query parameter sent by the client. And not as default in the code as Enablequery(Pagesize = 100)

    To achieve above requirement, you can try to create and use a customized EnableQueryAttribute, like below:

    In customized EnableQueryAttribute

    public class MyCustomQueryableAttribute : EnableQueryAttribute
    {
        public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
        {
            // dynamically set PageSize of ODataQuerySettings 
            // based on pagesize that client sent through querystring
    
            StringValues ps;
    
            // set default value to pagesize
    
            int pagesize = 2;
    
            if (queryOptions.Request.Query.TryGetValue("pagesize", out ps))
            {
                pagesize = int.Parse(ps);
            }
    
            var result = queryOptions.ApplyTo(queryable, new ODataQuerySettings { PageSize = pagesize });
            return result;
        }
    }
    

    In ODataController action

    [MyCustomQueryable]
    public IActionResult Get()
    {
        return Ok(_db.Books);
    }
    

    Test Result

    enter image description here