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)
归档时间: |
|
查看次数: |
14850 次 |
最近记录: |