使用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, 并且在检索完所有内容后,它会使用Skip
和Take
方法过滤它 ,I我正在寻找一种方法来使用我的HttpClient
应用Skip
和Take
方法,以便它只检索每个页面所需的记录。 可能吗? 如果是这样,怎么样?
为了将Take / Skip应用于数据检索,服务器必须知道它们。 您可以使用IQueryable LINQ提供程序(请参阅[1]以了解它的复杂程度),或者更好的方法是将适当的值传递给client.GetAsync
调用,类似于
HttpResponseMessage response = await client.GetAsync(client.BaseAddress + $"?skip={start}&take={perPage}");
当然, 您的服务器端代码必须正确解释skip
和take
参数; 这不是自动的 。
您可能还想查看OData(参见[2]),但我从未在生产中使用它; 我只知道它存在。