2016-04-19 15 views
-1

私はオブジェクトを$拡張できるようにする必要があるという珍しい必要があるようですが、標準Iqueryableを使ってはできません。

私はEntityFrameworkとAutoMapperを使用してデータベースエンティティから、ODataを介して公開するAPIデータオブジェクトに投影しています。これは、AutoMapperがProjectToできる要素に、私ができることを制限するという問題があります。

これは一般的に問題ではありません.Apiオブジェクト内のアイテムがデータベースの一部である場合です。私は今、他のソースから来るデータを追加しなければならない場合がある(時にはオプションである)オブジェクトを持っています。私たちは一般的にメモリ内に保持されているデータ(スタックトレースやランタイム統計を含むオブジェクトのエラーの詳細など)について話します。

このように、私はクエリを操作する方法を見つけ出す必要があります - 実際にはもっと重要なのは、単一のエンティティGET操作で$ expandを処理することです(マルチgetのサポートも歓迎ですが、 ODataQueryDetailsを使用してこれを行います)。単一項目クエリの

、しかし、私のような形で制御方法を有する:

取得([FromODataUri]のGuidキー)私ODataQueryDetailsへのアクセスを与えない{

まったく。この場合、誰もそのクエリの詳細を取得する方法を知っていますか?

"クエリをカスタマイズする"要素は、特に大きなものではありません - 一般的には、「多少のIQueryableインターフェイスで遊んでいる」と思われるようですが、多段階の処理が必要な場合や、メモリとデータベースのデータが混在しています。

注:Web API OData: How do you $expand on a single entity?は重複していません。これはパラメータ名(名前として必須のキー)を持つ単一の問題であり、十分に深くはありません。

+0

['ODataQueryOptions'](https://msdn.microsoft.com/en-us/library/system.web.odata.query.odataqueryoptions(v = vs.118))のインスタンスを取得する方法を尋ねていますか? .aspx)がコントローラメソッドに渡されましたか? – lencharest

+0

これは可能な解決策の1つです。 – TomTom

答えて

1

Getにパラメータを単に追加すると、Web APIパラメータバインディングによってメソッドに値が渡されます。 Thingをコントローラが処理するエンティティタイプとします。あなたがODataQueryOptionsのジェネリックバージョンを指定する必要があるか、例外が発生します

public IHttpActionResult Get([FromODataUri] Guid key, ODataQueryOptions<Thing> opts) 

注意。 (興味深い性質のいずれも公共のセッターを持っていない)

この

は、あなたの現在の要求のクエリオプションを表すオブジェクトを取得しますが、オプションを変更することはできません。クエリオプションを傍受したり変更したりする能力について多くの開発者の要望があるようですが、現時点ではすぐに使用できるソリューションはありません。現在5.1.0リリースを対象としている open issue on Githubを参照してください。コントローラーメソッドのクエリオプションを変更する際のベストプラクティスについては、 OData V4 modify $filter on server sideを参照してください。

+0

あなたはそれを持っています。 "ODataQueryOptionsのジェネリックバージョンを指定する必要があるか、または例外が発生することに注意してください。" ...私は決して試したことはありません;)非ジェネリックフォームがあり、ドキュメントが足りない – TomTom