迭代时仅从 Api 获取结果

Only fetch Results from Api when iterated

我有一个 Api 可以在页面中获取结果并将它们发送回客户端。在知道客户端将如何实际迭代我的项目之前,我如何最大限度地减少从 api 中获取的页面数量。 IE 可以说客户端只需要 5 个 Foo 项目。我的 api 当前将获取所有页面,即使客户端只使用了 5 个项目。除了传入要获取的项目数之外,还有其他方法吗?

var actualItems = _pagedApiCollection.GetItems<Foo>().Take(5).ToList();

Api 通话

 public IEnumerable<Foo> GetItems<Foo>()
 {
    public List<object> allElements = new List<object>();

       do
        {
            currentpage =  _pagedApi.GetNextPage(reqid);


            allElements.AddRange(currentpage.Items); 

        } while (currentpage.HasNextPage);

   IEnumerable<Foo> myNewEnumerable = allElements.Cast<Foo>();
   myNewEnumerable; 

}   

您可以通过一个一个地生成结果,将其变成一个适当的可枚举方法。

public IEnumerable<Foo> GetItems<Foo>() {
    Page currentPage;
    do
    {
        currentPage =  _pagedApi.GetNextPage(reqid);

        foreach (var item in currentPage)
            yield return (Foo)item;

    } while (currentpage.HasNextPage);
}

您仍然需要一次获取一页,因此如果您请求 6 页,但 _pagedApi 的页面大小为 5,您将获取 2 页,而不是每个页面。这种开销可能比逐条而不是逐页获取每条记录要小得多。

这是 IEnumerable 接口的强项,它在后台创建了一个状态机,用于跟踪循环的当前状态(如果需要详细说明,可以在 SO 或 MSDN 上搜索它) .