分页Web API返回的大量数据

use*_*134 11 c# asp.net asp.net-mvc paging asp.net-web-api

我们创建了用于查询Oracle数据库的WebAPI.查询返回巨大的结果,因此有时会抛出OutOfMemoryException.

建议是使用Paging概念.我不明白客户端应用程序将如何知道必须调用API多少次才能获得整个结果集.我还需要为分页创建一个单独的类,还是可以在我的API控制器中操作它.

任何人都可以帮我这个,因为这是我的第一个Web API.我们无法为此创建存储过程,因为我们只对数据库具有读访问权限

public HttpResponseMessage Getdetails([FromUri] string[] id)
{
    string connStr = ConfigurationManager.ConnectionStrings["ProDataConnection"].ConnectionString;
    using (OracleConnection dbconn = new OracleConnection(connStr))
    {
         var inconditions = id.Distinct().ToArray();
         var srtcon = string.Join(",", inconditions);
         DataSet userDataset = new DataSet();
         var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(" + srtcon + ")";
         using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn))
         {
              using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand))
             {
                 DataTable selectResults = new DataTable();
                 adapter.Fill(selectResults);
                 var returnObject = new { data = selectResults };
                 var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
                 ContentDispositionHeaderValue contentDisposition = null;

                 if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition))
                {
                     response.Content.Headers.ContentDisposition = contentDisposition;
                }

                return response;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dil*_*e-O 13

通过API进行分页的一般思想是客户端将传递他们想要的数据"页面"以及他们想要的"数量"记录.

从那里你可以构建你的查询的东西到效果

Select all records, but skip ((Page - 1) * amount) of records and take (amount) of records.

如果你使用LINQ to SQL,有Take()和Skip()方法可以帮助你在代码端更容易编写.如果您不使用LINQ to SQL,则需要找到特定于Oracle的内容.

最后请注意,由于良好的API被设计为"无状态",因此客户端需要在处理上一页/下一页查询时维护它们所在的页面.通常,页面和数量变量保存在Javascript中,甚至像隐藏变量一样简单,可以用来计算可用的页面数等等.

这是我做的一个WebAPI调用的基本示例,它进行了分页.如果LINQ to SQL/EF不支持,您可能需要稍微修改它以支持获取所有记录以及可能的Oracle特定内容:

public IActionResult GetProducts(int? page, int? count)
        {
            var takePage = page ?? 1;
            var takeCount = count ?? DefaultPageRecordCount;

            var calls = context.Products
                            .Skip((takePage - 1) * takeCount)
                            .Take(takeCount)
                            .ToList();

            return Json(calls);
        }
Run Code Online (Sandbox Code Playgroud)