我有一个使用.NET 4.5的OData Web API服务。它有一个从EntitySetController派生的WebApi控制器:
public class WorkItemsController : EntitySetController<WorkItem, string>
{
[Queryable(PageSize=100)]
public override IQueryable<WorkItem> Get()
{## Heading ##
// go to AWS DynamoDb, get the workitems and then return
}
}
如您所见,我默认将服务器端页面大小设置为100。后来我意识到我需要在Get()函数内以编程方式增加大小。有谁知道怎么做?
如果你想知道原因,这就是为什么: AWS DynamoDb不支持$ skip或$ top查询。每次客户想要获得一组工作项时,我需要从DynamoDb获得所有工作项。当数量很大时,如果每次只返回100个项目给用户,则需要很长时间。所以我的策略是每次返回用户的工作项数量加倍/三倍。因此,用户将获得100,200,400,800个连续请求的工作项。假设DynamoDb中有1500个工作项,我将仅查询4次以将所有工作项返回给用户。如果我们保持一个恒定的页面大小,比如100,我需要查询15次。
答案 0 :(得分:2)
您可以在方法中调用ODataQueryOptions并设置页面大小。
public IQueryable Get(ODataQueryOptions queryOptions)
{
var settings = new ODataQuerySettings { PageSize = 100 };
var result = GetResult();
return queryOptions.ApplyTo(result, settings);
}
答案 1 :(得分:0)
这正是LINQ2DynamoDB解决的问题。为了支持$ skip和$ top(即Enumerable.Skip()和Enumerable.Take()),它缓存了DynamoDb在ElastiCache中返回的结果。这样服务器端分页的工作效率更高,读取操作的数量也大大减少。
此外,LINQ2DynamoDB会自动支持OData,因此您甚至可能不需要执行任何WebApi控制器。
为什么不尝试呢? :)