C# 在处理大量数据时使用分页
我们创建了用于查询Oracle数据库的WebAPI。查询返回的结果非常大,因此有时会抛出OutOfMemoryException。目前正计划使用分页,以便在不抛出任何异常的情况下返回大量数据。下面是我们正在使用的API控制器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
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
自动实现分页:
安装软件包Microsoft.AspNet.Odata
[EnableQuery]
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
自动实现分页:
安装软件包Microsoft.AspNet.Odata
[EnableQuery]
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进行批处理集成,则不应该这样做。如果你在网络表单中填充下拉列表,那太荒谬了。不管怎样,我不知道有多少记录可以被拉过来——你必须进行实验。