使用Paging处理大量数据

时间:2016-08-04 03:42:02

标签: c# asp.net asp.net-web-api

我们创建了用于查询Oracle数据库的WebAPI。查询返回巨大的结果,因此它有时会抛出OutOfMemoryException。当前计划使用分页,因此返回大量数据而不抛出任何异常.Below是我们正在使用的API控制器

public class PDataController : ApiController
  {
    public HttpResponseMessage Getdetails([FromUri] string[] id)
    {
        List<OracleParameter> prms = new List<OracleParameter>();
        string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString;
        using (OracleConnection dbconn = new OracleConnection(connStr))
        {
            DataSet userDataset = new DataSet();
            var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(";
             StringBuilder sb = new StringBuilder(strQuery);
             for(int x = 0; x < inconditions.Length; x++)
                 {
                   sb.Append(":p" + x + ",");
                   OracleParameter p = new OracleParameter(":p" + x, OracleType.Int32);
                   p.Value = inconditions[x];
                   prms.Add(p);
                 }
            if(sb.Length > 0) sb.Length--;
            strQuery = strQuery + sb.ToString() + ")";
            using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn))
              {
                 selectCommand.Parameters.AddRange(prms.ToArray());
                 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;
                }
            }

        }
    }

我希望在上面的代码中使用分页概念。我是ASP的新手。 NET和C#编程,这个概念对我来说是全新的。当我用Google搜索并在其他论坛中找到时,我看到使用页面大小,我怎么知道输入中的最大记录数,每次都会给出不同的ID,每次返回差异行数。

目前我将API称为

http://localhost:80/api/PData?id='A001'&id='A002'

如果我给出pagesize,我将如何在输入参数中添加页面。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

在Web API 2.0中,您可以利用ODATA queries。这样您就可以使用关键字topskip自动实现分页:

  1. 在Visual Studio包管理器控制台中运行此命令 - Install-Package Microsoft.AspNet.Odata
  2. 使用[EnableQuery]
  3. 装饰您的WEB API方法

    如果这是我的api控制器:

    public class ValuesController : ApiController
    {
        [EnableQuery]
        public IQueryable<string> Get()
        {
            return new string[] { "value1", "value2","values3","values4" }.AsQueryable<string>();
        }
    }
    

    要获得我将使用的前两个值:

    http://localhost:9658/api/values?$top=2
    

    接下来的两个:

    http://localhost:9658/api/values?$top=2&$skip=2