ASP.net MVC 4(web api)OData配置
一直在玩(单页应用程序)示例。我发现真正有趣的是GetBooksForSearch方法(/api/BigShelf/GetBooksForSearch),它需要额外的ASP.net MVC 4(web api)OData配置,odata,asp.net-web-api,Odata,Asp.net Web Api,一直在玩(单页应用程序)示例。我发现真正有趣的是GetBooksForSearch方法(/api/BigShelf/GetBooksForSearch),它需要额外的$filter,$inlinecount,$top,$skip参数用于分页和筛选结果,这些参数在控制器代码中不存在: public IQueryable<Book> GetBooksForSearch (string profileIds, Sort sort, bool sortAscending) 公共可查
$filter
,$inlinecount
,$top
,$skip
参数用于分页和筛选结果,这些参数在控制器代码中不存在:
public IQueryable<Book> GetBooksForSearch
(string profileIds, Sort sort, bool sortAscending)
公共可查询的GetBooksForSearch
(字符串profileID、排序、布尔排序)
我找不到任何关于控制器如何翻译和过滤结果的文档,更重要的是,如何配置此类行为(例如,限制最大结果),有人有线索吗
--更新--
发现MVCWebAPI正在发挥作用。但是我们如何配置它呢?有一个关于使用MVC Web API进行分页和查询的简短网络广播,您可以观看 它解释了如何通过以下两种方式执行分页:
- 使用OData查询语法,在这种情况下,Web API会自动为您解释和检索结果
- 或者编写自己的方法,将
和pageIndex
作为参数,然后返回请求的项数pageSize
好的,您无法配置使用第一种方法返回的最大项目数,但是您可以使用第二种方法限制返回的项目数,只需检查
if(pageSize>maxPage),然后返回maxPage项目
有一个名为action filter的属性,您可以在任何返回IQueryable
甚至IEnumerable
的操作方法上使用该属性来限制返回的数据量
[ResultLimit(100)]
public IQueryable<Product> Get() {
// ...
}
[结果限制(100)]
公共IQueryable Get(){
// ...
}
似乎ResultSimulation属性已被删除。看到这个了吗
它被合并为[Queryable]属性的一个特性,现在OData支持需要这个特性。见讨论
现在需要正确使用
[Queryable(ResultLimit=10)]
[更新]
从RTM开始,Queryable的ResultLimit功能已被删除。此外,[Queryable]已移动到它自己的预览包中。有关更多信息,请参阅博文,有关新用法的说明,请参阅博文
[更新2 11-16-12]
有了ASP.Net 2012秋季更新预览,所有内容都再次更新。
[Queryable]属性的ResultLimit属性已添加回OData包
有关某些更改的详细信息,请参阅文章
是更新的Nuget包。在撰写本文时,它是一个预览包 正如科迪·克拉克(Cody Clark)所指出的,随着时间的推移,这一领域发生了许多变化。从WebAPI的5.2版本开始,您现在使用
enableQueryNotation
并使用PageSize
参数,而不是QueryableAttribute
或ResultLimit
。([Queryable]
仍能工作,但已标记为过时。)当前,您将使用以下语法:
[EnableQuery(PageSize = 20, MaxTop = 20)]
public IQueryable<Product> Get() {
// ...
}
[启用查询(PageSize=20,MaxTop=20)]
公共IQueryable Get(){
// ...
}
通过使用
PageSize
,可以为未经参数化的请求设置默认页面大小。如果不包括MaxTop
值,恶意客户端可能会将top设置为非常高的值,并绕过页面默认值。使用MaxTop
,如果客户端请求的记录超过API支持的数量,您将抛出异常。选项1的封面下隐藏着秘密仙子灰尘。您可以同样轻松地编写自己的方法,只加载必要的数据。使用选项1,框架只需在IQueryable上调用.Take、.Skip等即可return@RobertLevy,doing.Take接受IQueryable返回不是一个好主意,因为OData还定义了过滤操作。这将使IQueryable.Take(n).filter()代替IQueryable.filter().Take(n)
This()似乎是一个新的过滤器,我想这是为新框架设计的,正是我想要的。除了使用属性,还有其他选择吗?只是因为属性必须使用常量,所以无法从配置中提取数值。@LukePlupett您可以尝试编写一个从配置中提取数值的筛选器属性。看起来ResultLimit已被5.2正式版本删除。这现在可以在PageSize的EnableQueryAttribute中找到。