我一直忙于对 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 完全不同,但元数据中没有任何线索表明该CheckOut
操作接受基本上是 IQueryable 的CheckOutMany
操作与接受一组 MovieID 的操作。是的,我看到该CheckOutMany
操作有额外的参数,但在我看来,它不应该真的有一个 BindingParameter 条目。
我想我可以有一个启发式来选择这种情况——我们接受一个 BindingParameter 这是一个集合,但也接受一个由与感兴趣的实体的单键类型匹配的原语组成的集合(在这种情况下是int
)。坦率地说,这有点不稳定,但至少会起作用。
直接问题(但非常感谢您对上述内容的评论!)
a)这是唯一的方法(即,做一个启发式)?
b) 我们能否更改“ActionConfiguration”设置,使其CheckOutMany
不会像以前那样绑定到集合CheckOut
?
c) 或者,这是一个设计缺陷、错误还是只是尚未完全成熟的功能?