【问题标题】:WebAPI OData Actions Sample - Differentianting between CheckOut and CheckOutMany actionsWebAPI OData 操作示例 - CheckOut 和 CheckOutMany 操作之间的区别
【发布时间】:2013-07-23 07:02:58
【问题描述】:

我一直忙于对 T4 模板进行自己的自定义,以便我可以从 .NET 客户端进行强类型 OData 操作调用。这可能是我创建的第一个开源项目 :)

无论如何,我已经针对称为“ODataActionsSample”的 OData 操作的 WebAPI OData 示例进行了测试和开发。对于那些想在家一起玩的人,您可以在http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ODataActionsSample/ 找到样本。

该示例有几个更有趣的操作。目前我正在尝试支持这两个基于集合的操作,因为我已经控制了其他操作。这两个动作是 CheckOut 动作(接受 $filter 查询的覆盖)和 CheckOutMany 动作(接受电影 ID 的集合)。

示例代码...

        // CheckOut action
        // URI: ~/odata/Movies/CheckOut
        // Shows how to bind to a collection, instead of a single entity.
        // This action also accepts $filter queries. For example:
        //     ~/odata/Movies/CheckOut?$filter=Year eq 2005
        var checkOutFromCollection = modelBuilder.Entity<Movie>().Collection.Action("CheckOut");
        checkOutFromCollection.ReturnsCollectionFromEntitySet<Movie>("Movies");

        // CheckOutMany action
        // URI: ~/odata/Movies/CheckOutMany
        // Shows an action that takes a collection parameter.
        ActionConfiguration checkoutMany = modelBuilder.Entity<Movie>().Collection.Action("CheckOutMany");
        checkoutMany.CollectionParameter<int>("MovieIDs");
        checkoutMany.ReturnsCollectionFromEntitySet<Movie>("Movies");

为这些生成的元数据几乎相同。这是

    <FunctionImport Name="CheckOut" ReturnType="Collection(ODataActionsSample.Models.Movie)" IsBindable="true" EntitySet="Movies" m:IsAlwaysBindable="true">
      <Parameter Name="bindingParameter" Type="Collection(ODataActionsSample.Models.Movie)" Nullable="false" />
    </FunctionImport>
    <FunctionImport Name="CheckOutMany" ReturnType="Collection(ODataActionsSample.Models.Movie)" IsBindable="true" EntitySet="Movies" m:IsAlwaysBindable="true">
      <Parameter Name="bindingParameter" Type="Collection(ODataActionsSample.Models.Movie)" Nullable="false" />
      <Parameter Name="MovieIDs" Type="Collection(Edm.Int32)" Nullable="false" />
    </FunctionImport>

正如您在示例中的 cmets 中看到的那样,调用每个的 URI 完全不同,但元数据中并没有任何线索表明 CheckOut 操作接受基本上是 IQueryable 与 CheckOutMany 操作它接受一组 MovieID。是的,我看到 CheckOutMany 操作有额外的参数,但在我看来它不应该真的有 BindingParameter 条目。

我想我可以有一个启发式来选择这种情况 - 我们接受一个 BindingParameter 这是一个集合,但也接受一个由与感兴趣实体的单键类型匹配的原语组成的集合(在这种情况下那是int)。坦率地说,这有点不稳定,但至少可以工作。

直接问题(但上面的 cmets 非常感谢!)

a) 这是唯一的方法吗(即,进行启发式)?

b) 我们能否更改“ActionConfiguration”设置,使CheckOutMany 不会像CheckOut 那样绑定到集合?

c) 或者,这是一个设计缺陷、错误还是只是尚未完全成熟的功能?

【问题讨论】:

  • 查看更多内容,因为 CheckOutMany 绑定到 Movies 集合,因此通过 OData 过滤器并使用 ODataController 上的 QueryOptions 属性从 CheckOutMany 的服务器端代码中访问它仍然是非常合法的。我想这个例子应该真的是 CheckOutMany 没有绑定到 Movies 集合,因为该操作在接受 OData 过滤器的同时,实际上对它没有任何作用。我已经修改了示例源以尊重给定的过滤器。
  • ASP.Net codeplex 网站上的讨论帖:aspnetwebstack.codeplex.com/discussions/451003

标签: c# asp.net asp.net-web-api odata


【解决方案1】:

您对CheckOutMany 的观察是正确的。 CheckOutMany 绑定到实体集合没有意义,因为它已经将必须签出的电影 ID 作为输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2017-02-11
    • 2015-04-10
    • 1970-01-01
    • 2021-11-02
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多