Использовать методы LINQ (Skip and Take) с методом HttpClient.GetAsync для повышения производительности? - PullRequest
0 голосов
/ 28 апреля 2018

Я использовал следующий код для извлечения содержимого канала JSON, и, как вы видите, я использовал методы подкачки и такие методы Skip и Take, как этот:

[HttpGet("[action]")]
public async Task<myPaginatedReturnedData> MyMethod(int page)
{
    int perPage = 10;
    int start = (page - 1) * perPage;

    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri("externalAPI");
        MediaTypeWithQualityHeaderValue contentType =
            new MediaTypeWithQualityHeaderValue("application/json");
        client.DefaultRequestHeaders.Accept.Add(contentType);
        HttpResponseMessage response = await client.GetAsync(client.BaseAddress);
        string content = await response.Content.ReadAsStringAsync();
        IEnumerable<myReturnedData> data = 
               JsonConvert.DeserializeObject<IEnumerable<myReturnedData>>(content);
        myPaginatedReturnedData datasent = new myPaginatedReturnedData
        {
            Count = data.Count(),
            myReturnedData = data.Skip(start).Take(perPage).ToList(),
        };
        return datasent;
    }
}

Мой пейджинг работает нормально, однако я не вижу каких-либо улучшений производительности, и я знаю, что это потому, что каждый раз, когда я запрашиваю новую страницу, он снова и снова вызывает API и после получения всего содержимого фильтрует его, используя Skip и Take методы , я ищу способ применения Skip и Take методов с моим HttpClient, чтобы он только извлекал необходимые записи для каждой страницы. Является ли это возможным? Если да, то как?

1 Ответ

0 голосов
/ 28 апреля 2018

Чтобы применить Take / Skip к поиску данных, сервер должен знать о них. Вы можете сделать это с поставщиком IQueryable LINQ (см. [1], чтобы получить только представление о том, насколько это сложно) или, лучше, передав соответствующие значения в вызов client.GetAsync, что-то вроде

HttpResponseMessage response = await client.GetAsync(client.BaseAddress + $"?skip={start}&take={perPage}");

Конечно, ваш серверный код должен правильно интерпретировать эти skip и take параметры; это не автоматически .

Возможно, вы также захотите взглянуть на OData (см. [2]), но я никогда не использовал его в производстве; Я просто знаю, что это существует.

[1] https://msdn.microsoft.com/en-us/library/bb546158.aspx

[2] https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/calling-an-odata-service-from-a-net-client

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...