我使用以下代码检索JSON Feed的内容,如您所见,我使用了分页技术以及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
,以便它仅检索每个页面所需的记录。可能吗?如果是这样,怎么样?
答案 0 :(得分:-1)
为了将Take / Skip应用于数据检索,服务器必须知道它们。您可以使用IQueryable LINQ提供程序(请参阅[1]以了解其复杂程度),或者更好的方法是将适当的值传递给client.GetAsync
调用,例如
HttpResponseMessage response = await client.GetAsync(client.BaseAddress + $"?skip={start}&take={perPage}");
当然,您的服务器端代码必须正确解释这些skip
和take
参数;它不是自动的。
您可能还想看看OData(参见[2]),但我从未在生产中使用它;我知道它存在。