我们创建了用于查询Oracle数据库的WebAPI。查询返回巨大的结果,因此有时会抛出gcc
。
建议使用 Paging 概念。我不明白客户端应用程序将如何知道必须调用API多少次才能获得整个结果集。我还需要为分页创建一个单独的类,还是可以在我的API控制器中操作它。
任何人都可以帮助我,因为这是我的第一个Web API。我们无法为此创建存储过程,因为我们只对数据库具有读访问权
OutOfMemoryException
答案 0 :(得分:12)
通过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);
}
答案 1 :(得分:0)
IQueryable<ShowMedicineViewModel> query;
List<ShowMedicineViewModel> medic = new List<ShowMedicineViewModel>();
var medicineInfo = _dbContext.medicine_details.Where(m => (m.Medicine_name.StartsWith(medicinename)) && (m.Medicine_type == medicinetype)).ToList();
List<string> TotalMedicine = new List<string>();
var results = (medicineInfo.OrderBy(x => x.id)
.Skip((pages - 1) * 2)
.Take(2));
Parallel.ForEach(results, item =>
{
var temp = Mapper.DynamicMap<medicine_details, ShowMedicineViewModel>(item);
medic.Add(temp);
});
Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
dictionary2.Add("CurrentPage", pages);
dictionary2.Add("TotalPages", medicineInfo.Count() / 2 < 1 ? 1 : medicineInfo.Count());
Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("Data", medic);
dictionary.Add("Page", dictionary2);
return dictionary;