Получать результаты из Api только при повторении - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть Api, который выбирает результаты в страницах и отправляет их обратно клиенту.Как мне минимизировать количество выборок страниц из API, прежде чем узнавать, как мои элементы клиент будет фактически перебирать.IE позволяет клиенту получить только 5 элементов Foo.Мой API в настоящее время извлекает все страницы, даже если клиент использует только 5 элементов.Есть ли какой-либо другой способ, кроме ввода количества элементов, которые нужно получить?

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

Api Call

 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; 

}   

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете превратить это в правильный перечислимый метод, получая результаты один за другим.

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, если вам нужно подробное объяснение).

...