迭代时仅从 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 上搜索它) .
我有一个 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 上搜索它) .