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

6
我一直在尝试使用(单页应用程序)BigShelf示例。我发现非常有趣的是GetBooksForSearch方法(/api/BigShelf/GetBooksForSearch)需要额外的$filter、$inlinecount、$top和$skip参数来进行分页和过滤结果,而这些参数在控制器代码中并不存在。
public IQueryable<Book> GetBooksForSearch
    (string profileIds, Sort sort, bool sortAscending)

我找不到有关该控制器如何翻译和过滤结果以及更重要的是如何配置此行为(例如,限制最大结果)的任何文档,有人知道吗?

-- 更新 --

发现MVC Web API可以解决问题。但我们如何配置它呢?

4个回答

14

看起来 ResultLimitAttribute 已被删除。请参考此提交记录

它已经合并到 [Queryable] 属性的一个功能中,该功能现在是 OData 支持所必需的。请参见此处的讨论

正确的用法现在应该是

[Queryable(ResultLimit = 10)]

[更新]

从RTM开始,Queryable的ResultLimit功能已被删除。另外,[Queryable]已被移动到它自己的预览包中。有关更多信息,请参见博客文章和文章以获取新用法的说明。

[更新2 11-16-12] 随着 ASP.Net Fall 2012 Update Preview 的发布,一些更新也做了调整。 [Queryable]属性的 ResultLimit 属性已重新添加到 OData 包中。

请查看本文此处以了解一些变化的情况。

这里是更新后的 Nuget 包。截至本文撰写,它是预览版。


1
似乎“ResultLimit”在5.2正式版中被移除了。现在可以在“EnableQueryAttribute”中使用“PageSize”找到它。 - Jim Wooley

11

有一个叫做ResultLimitAttribute的操作过滤属性,您可以在返回IQueryable<T>IEnumerable<T>的任何操作方法上使用它以限制返回的数据量。

[ResultLimit(100)]
public IQueryable<Product> Get() {
    // ...
}

这个(http://msdn.microsoft.com/en-us/library/system.web.http.resultlimitattribute(v=vs.108).aspx)似乎是一个新的过滤器,我猜测它是为新框架设计的,正好符合我的需求。 - xandy
有没有替代方案可以不使用属性?问题在于数字无法从配置中获取,因为属性必须使用常量。 - Luke Puplett
1
@LukePuplett 你可以尝试编写一个过滤器属性,从配置中提取值。 - marcind

3

有一个关于使用MVC Web API进行分页和查询的短视频,您可以在这里观看。

视频解释了如何通过以下方法之一执行分页:

  • 使用OData查询语法,Web API会自动解释并检索结果
  • 编写自己的方法,将pageIndexpageSize作为参数,并返回请求的项目数。

据我所知,您无法使用第一种方法配置返回的最大项目数,但是可以通过使用第二种方法限制返回的项目数,并仅检查if (pageSize>maxPage) then return maxPage items


选项1下的覆盖层下面有秘密的仙女粉。你可以很容易地编写自己的方法,只加载必要的数据。使用选项1,框架将在您返回的IQueryable上调用.Take、.Skip等方法。 - Robert Levy
1
@RobertLevy,对IQueryable返回值进行.Take操作并不是一个好主意,因为OData还定义了过滤操作。这将使得IQueryable.Take(n).filter()代替IQueryable.filter().Take(n) - xandy

1
正如Cody Clark所指出的那样,这个领域随着时间的推移发生了相当多的变化。从WebAPI 5.2版本开始,您现在可以使用EnableQueryAnnotation并使用PageSize参数而不是QueryableAttributeResultLimit。([Queryable]仍然有效,但已被标记为过时。)目前,您将使用以下语法:
[EnableQuery(PageSize = 20, MaxTop = 20)]
public IQueryable<Product> Get() {
    // ...
}

通过使用PageSize,您可以设置未参数化请求的默认页面大小。如果不包括MaxTop值,则流氓客户端可能会将顶部设置为非常高的值并绕过页面默认值。使用MaxTop,如果客户端请求超过API支持的记录数,将抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接