cl0*_*l0h 0 asp.net odata asp.net-web-api2
我正在使用 OdataControllers 编写 ASP.NET Web API 2 Web 服务,我已经找到了如何使用EnableQueryAttribute的PageSize属性设置页面大小。我想允许我的 Web 服务的用户在 app.config 中设置页面大小,然后让应用程序读取此设置并设置页面大小。问题是使用该属性需要将“页面大小”设置为编译时常量。
属性的用法:
[EnableQuery(PageSize = 10)]
public IHttpActionResult GetProducts()
{
return repo.GetProducts();
}
Run Code Online (Sandbox Code Playgroud)
我见过的一种建议解决方案是构造 EnableQueryAttribute 并将其设置在 HTTPConfiguration 配置对象上,如下所示
int customSize = ReadPageSizeSettingFromConfigFile();
var attr = new EnableQueryAttribute { PageSize = customSize };
config.AddODataQueryFilter(attr);
Run Code Online (Sandbox Code Playgroud)
但这实际上不起作用。HttpConfiguration 的 Filter 集合保持为空。
另一篇文章的评论(隐藏在评论列表中)建议删除控制器上的所有 EnableQuery 属性,但这也没有效果。由于 EnableQuery 属性取代了旧的Queryable属性,我想知道这是否是 Microsoft 的问题。
这个问题之前已经被问过但没有得到回答:How limit OData results in a WebAPI
非常感谢所有帮助。
如果客户希望页面大小为 10,并且想要第二页,则可以使用 $top 和 $skip 来实现您的目标:
localhost/odata/Customers?$top=10&$skip=10
Run Code Online (Sandbox Code Playgroud)
关于动态设置pagesize:
public class MyEnableQueryAttribute : EnableQueryAttribute
{
public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
{
int pagesize = xxx;
var result = queryOptions.ApplyTo(queryable, new ODataQuerySettings { PageSize = pagesize });
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
并将此属性放入您的控制器方法中。