C# 在处理大量数据时使用分页

C# 在处理大量数据时使用分页,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我们创建了用于查询Oracle数据库的WebAPI。查询返回的结果非常大,因此有时会抛出OutOfMemoryException。目前正计划使用分页,以便在不抛出任何异常的情况下返回大量数据。下面是我们正在使用的API控制器 public class PDataController : ApiController { public HttpResponseMessage Getdetails([FromUri] string[] id) { List<O

我们创建了用于查询Oracle数据库的WebAPI。查询返回的结果非常大,因此有时会抛出OutOfMemoryException。目前正计划使用分页,以便在不抛出任何异常的情况下返回大量数据。下面是我们正在使用的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;
                }
            }

        }
    }

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

在Web API 2.0中,您可以利用。这允许您使用关键字
top
skip
自动实现分页:

  • 在Visual Studio软件包管理器控制台中运行以下命令-
    安装软件包Microsoft.AspNet.Odata
  • 使用
    [EnableQuery]
  • 如果这是我的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&$skip=2
    

    在Web API 2.0中,您可以利用。这允许您使用关键字
    top
    skip
    自动实现分页:

  • 在Visual Studio软件包管理器控制台中运行以下命令-
    安装软件包Microsoft.AspNet.Odata
  • 使用
    [EnableQuery]
  • 如果这是我的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&$skip=2
    

    首先想一想为什么要通过web API发送如此大量的数据。这些数据用于什么?我还看到您有
    选择*
    。你真的需要每一个专栏吗?。不管怎么说,还是转到分页。通过分页,可以在参数中传递页码。(第一次调用将使用1)。您的API使用此页码来构建一个适当的SQL查询(如from here:),该查询只返回该页数据。您的呼叫应用程序中需要记住页码,即下一次呼叫将在参数中有第2页。我明确给出Select语句中所需的coulmn名称,只要它们是uge我刚才给出的*。数据非常庞大,有时会返回超过1000000条记录。那么,在每个页面中,有多少条记录可以被提取出来,而哪些应用程序通过web API使用了一百万条记录呢?如果您使用web api进行批处理集成,则不应该这样做。如果你在网络表单中填充下拉列表,那太荒谬了。不管怎样,我不知道有多少条记录可以被提取出来——你必须进行实验。首先想想为什么你要通过web API发送如此大量的数据。这些数据用于什么?我还看到您有
    选择*
    。你真的需要每一个专栏吗?。不管怎么说,还是转到分页。通过分页,可以在参数中传递页码。(第一次调用将使用1)。您的API使用此页码来构建一个适当的SQL查询(如from here:),该查询只返回该页数据。您的呼叫应用程序中需要记住页码,即下一次呼叫将在参数中有第2页。我明确给出Select语句中所需的coulmn名称,只要它们是uge我刚才给出的*。数据非常庞大,有时会返回超过1000000条记录。那么,在每个页面中,有多少条记录可以被提取出来,而哪些应用程序通过web API使用了一百万条记录呢?如果您使用web api进行批处理集成,则不应该这样做。如果你在网络表单中填充下拉列表,那太荒谬了。不管怎样,我不知道有多少记录可以被拉过来——你必须进行实验。