分页Web API返回的大量数据

时间:2016-08-03 20:16:04

标签: c# asp.net asp.net-mvc asp.net-web-api paging

我们创建了用于查询Oracle数据库的WebAPI。查询返回巨大的结果,因此有时会抛出gcc

建议使用 Paging 概念。我不明白客户端应用程序将如何知道必须调用API多少次才能获得整个结果集。我还需要为分页创建一个单独的类,还是可以在我的API控制器中操作它。

任何人都可以帮助我,因为这是我的第一个Web API。我们无法为此创建存储过程,因为我们只对数据库具有读访问权

OutOfMemoryException

2 个答案:

答案 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;