ASP.net MVC 4(web api)OData配置

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) 公共可查

一直在玩(单页应用程序)示例。我发现真正有趣的是GetBooksForSearch方法(/api/BigShelf/GetBooksForSearch),它需要额外的
$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中找到。