WebAPI OData操作示例-CheckOut和CheckOutMany操作之间的区别



我一直忙于对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>

正如您在示例的注释中看到的,调用每个URI的URI都非常不同,但元数据中并没有任何线索表明CheckOut操作接受基本上是IQueryable的内容,而CheckOutMany操作接受一组MovieID。是的,我看到CheckOutMany操作有额外的参数,但在我看来,它实际上不应该有BindingParameter条目。

我想我可以用一个启发式方法来处理这个例子——我们接受一个BindingParameter,它是一个集合,但也接受一个由匹配感兴趣实体的单个键类型的基元组成的集合(在这种情况下是int)。坦率地说,这有点不稳定,但它至少会起作用。

直接提问(但非常感谢对以上内容的评论!)

a) 这是唯一的方法吗?

b) 我们是否可以更改"ActionConfiguration"设置,使CheckOutMany不会像CheckOut那样绑定到集合?

c) 或者,这是一个设计缺陷、bug,还是只是还没有完全成熟的功能?

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

最新更新