私は、.NET クライアントから OData アクションの呼び出しを厳密に型指定できるように、T4 テンプレートを独自にカスタマイズすることに忙しくしていました。おそらく、私が作成する最初のオープンソースのものになるでしょう:)
とにかく、「ODataActionsSample」と呼ばれる OData アクションの WebAPI OData サンプルに対してテストと開発を行いました。自宅で遊んでみたい方は、http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ODataActionsSample/でサンプルを見つけることができます。
このサンプルには、さらに興味深いアクションがいくつかあります。現時点では、2 つのコレクション ベースのアクションをサポートしようとしています。これは、他のアクションを既に制御しているからです。これら 2 つのアクションは、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) あるいは、これは設計上の欠陥、バグ、またはまだ完成していない単なる機能ですか?