我们创建了用于查询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,我将如何在输入参数中添加页面。任何人都可以帮助我。
答案 0 :(得分:2)
在Web API 2.0中,您可以利用ODATA queries。这样您就可以使用关键字top
和skip
自动实现分页:
Install-Package 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
接下来的两个:
http://localhost:9658/api/values?$top=2&$skip=2