【问题标题】:ASP.net MVC 4 (web api) OData ConfigurationASP.net MVC 4 (web api) OData 配置
【发布时间】:2012-03-11 13:42:38
【问题描述】:

一直在玩(单页应用程序)BigShelf 示例。我发现真正有趣的是 GetBooksForSearch 方法 (/api/BigShelf/GetBooksForSearch),它需要额外的 $filter$inlinecount$top$skip 参数用于分页和过滤结果,这些参数在控制器代码中不存在:

public IQueryable<Book> GetBooksForSearch
    (string profileIds, Sort sort, bool sortAscending)

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

-- 更新了--

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

【问题讨论】:

    标签: odata asp.net-web-api


    【解决方案1】:

    似乎 ResultLimitAttribute 已被删除。看到这个commit

    它已被纳入 [Queryable] 属性的一项功能中,现在 OData 支持需要该功能。见讨论here

    现在正确使用应该是

    [Queryable(ResultLimit = 10)]

    [更新]

    从 RTM 开始,Queryable 的 ResultLimit 功能已被删除。此外,[Queryable] 已移至其自己的预览包中。有关更多信息,请参阅 this 博客文章,有关新用法的说明,请参阅 this 文章。

    [更新 2 11-16-12] 随着 ASP.Net 2012 年秋季更新预览的内容再次更新。 [Queryable] 属性的 ResultLimit 属性已添加回 OData 包。

    请参阅文章 here 了解一些更改。

    Here 是更新的 Nuget 包。在撰写本文时,它是一个预览包。

    【讨论】:

    • 看起来 ResultLimit 已被 5.2 正式版删除。这现在可以在 PageSize 的 EnableQueryAttribute 中找到。
    【解决方案2】:

    有一个名为ResultLimitAttribute 的操作过滤器属性,您可以在任何返回IQueryable&lt;T&gt; 甚至IEnumerable&lt;T&gt; 的操作方法上使用它来限制返回的数据量。

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

    【讨论】:

    • 这 (msdn.microsoft.com/en-us/library/…) 似乎是一个新的过滤器,我猜这是为新框架设计的,正是我想要的..
    • 是否有替代使用属性的方法?只是因为属性必须使用常量,所以无法从配置中提取数字。
    • @LukePuplett 您可以尝试编写一个从配置中提取值的过滤器属性
    【解决方案3】:

    有一个关于使用 MVC Web API 进行分页和查询的简短网络广播,您可以观看here

    它解释了如何通过任一方式执行分页

    • 使用 OData 查询语法,在这种情况下,Web API 会自动为您解释和检索结果,
    • 或编写您自己的方法,将pageIndexpageSize 作为参数,然后返回请求的项目数。

    AFAIK,您无法配置使用第一种方法返回的最大项目数,但您可以使用第二种方法限制返回的项目数,只需检查if (pageSize&gt;maxPage) then return maxPage items

    【讨论】:

    • 选项 1 隐藏着秘密的仙尘。您可以轻松编写自己的方法,只加载必要的数据。使用选项 1,框架只会在您返回的 IQueryable 上调用 .Take、.Skip 等
    • @RobertLevy,对 IQueryable 返回执行 .Take 不是一个好主意,因为 OData 还定义了过滤操作。这将使IQueryable.Take(n).filter() 而不是IQueryable.filter().Take(n)
    【解决方案4】:

    正如 Cody Clark 指出的那样,随着时间的推移,这个领域发生了相当多的变化。从 5.2 版本的 WebAPI 开始,您现在使用 EnableQueryAnnotationPageSize 参数,而不是 QueryableAttributeResultLimit。 ([Queryable] 仍然可以使用,但它被标记为已过时。)目前您将使用以下语法:

    [EnableQuery(PageSize = 20, MaxTop = 20)]
    public IQueryable<Product> Get() {
        // ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2013-08-17
      • 2012-03-30
      • 2012-06-18
      • 1970-01-01
      • 2013-03-24
      • 2012-09-15
      相关资源
      最近更新 更多