【发布时间】:2023-04-03 08:58:01
【问题描述】:
我的要求是做客户端分页。即根据客户端给出的值($top,$skip)返回一组记录。但根据我下面的代码,我只能使用过滤关键字和顶部或跳过。
[HttpGet]
public PageResult<PersistedUser> GetAllUsers(ODataQueryOptions options)
{
TableServiceContext serviceContext = tableClient.GetDataServiceContext();
serviceContext.IgnoreResourceNotFoundException = true;
CloudTableQuery<PersistedUser> users = serviceContext
.CreateQuery<PersistedUser>(TableNames.User)
.AsTableServiceQuery();
IQueryable<PersistedUser> results = options
.ApplyTo(users.AsQueryable()) as IQueryable<PersistedUser>;
// manipulate results. Add some calculated variables to the collection etc
return new PageResult<PersistedUser>(results, null, 0);
}
我不确定这是否也是正确的方法。但我的基本要求是我有一个巨大的数据库,但我只需要在有效的时间内一次返回一小组实体。如果有人能提供一些代码 sn-ps,我将不胜感激。
【问题讨论】:
-
您可能要记住的一件事是,表存储本身并不支持所有 OData 功能(例如不支持 $skip),因此您需要在服务层中自行管理它.
-
是的,我知道表存储不支持所有这些操作。这就是为什么我想知道该怎么做。如果我获取所有结果并将它们转换为列表,然后应用 OData 选项,那么它不是有效的权利。获取 20 条记录所需的时间与获取 1000 条记录所需的时间相同。知道为 API 实现分页的有效方法吗?
-
我认为您可能需要回到绘图板上,看看您是否需要以不同于您今天所做的方式来存储数据以完成 OData 功能。如果数据存储在一起,那么我认为您唯一的选择是从表中获取所有数据并在您的服务层中应用这些 OData 过滤器,这对于较小的数据集可能不是问题,但一旦您的数据将是一个大问题集合变大了。
标签: c# azure asp.net-web-api pagination odata