使用HttpClient.GetAsync方法的LINQ(Skip和Take)方法来提高性能?

我使用以下代码来检索JSON提要的内容,如您所见,我使用了分页技术和Skip and Take方法,如下所示:

 [HttpGet("[action]")] public async Task 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 data = JsonConvert.DeserializeObject<IEnumerable>(content); myPaginatedReturnedData datasent = new myPaginatedReturnedData { Count = data.Count(), myReturnedData = data.Skip(start).Take(perPage).ToList(), }; return datasent; } } 

我的分页工作正常,但我看不到任何性能提升,我知道这是因为每次我请求新页面时它会一次又一次地调用API, 并且在检索所有内容后,它会使用SkipTake方法过滤它 ,I我正在寻找一种方法来使用我的HttpClient应用SkipTake方法,以便它只检索每个页面所需的记录。 可能吗? 如果是这样,怎么样?

为了将Take / Skip应用于数据检索,服务器必须知道它们。 您可以使用IQueryable LINQ提供程序(请参阅[1]以了解它的复杂程度),或者更好的方法是将适当的值传递给client.GetAsync调用,类似于

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

当然, 您的服务器端代码必须正确解释skiptake参数; 这不是自动的

您可能还想查看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网客户端