3

DataServices を公開するために Entity Framework に接続された OData エンドポイントがありますが、実行時にいくつかのメタデータに基づいて出力されるデータを形成し、URL よりもクエリをより制限したいと考えています。

例えば:

http://services.odata.org/OData/OData.svc/Category(1)/Products ?$top=2&$orderby=名前

これがヨーロッパにいるユーザーの場合、「ヨーロッパ」の地域を持つ製品を返すようにしたいのですが、次のようにクライアントから提供されたフィルターを URL に含める必要はありません。

http://services.odata.org/OData/OData.svc/Category(1)/Products $top=2&$orderby=name&$filter=Region eq 'Europe'

Query Interceptors はこのようなことに使用できることがわかりましたが、これは多数のエンティティに対するすべてのクエリに適用される概念であるため、すべてのエンティティに適用するよりも一般的な方法があることを望んでいました。すべてのエンティティでインターセプターを指定します。

また、ユーザー権限に基づいて特定のフィールドを非表示にすることも検討しています。たとえば、フィールドが機密としてマークされている場合、ユーザーが機密データの表示を許可されているかどうかに基づいて、クエリまたは結果からフィールドを動的に削除できます。上で説明した手法は、これらのシナリオの両方に対する解決策になると思います。

URL の変更はおそらく行き当たりばったりなので、EF が作成する式ツリーにアクセスして、実行直前に項目を追加または削除できますか?

関連する場合に備えて、DataService 基本クラスを使用してデータを公開しています。

パブリック クラス MyDataService : DataService

これは迅速かつ簡単ですが、私が望むものを達成するのが難しいかもしれません

どんな助けでも大歓迎です - それが私が達成しようとしていることの単なる特定の名前であっても、それは解決策の研究に役立ちます

4

1 に答える 1

2

残念ながら、今日の WCF Data Services でこれを行う簡単な方法はありません (前述の QueryInterceptors 以外)。チームは、この種の機能に対する要求を頻繁に聞いており、この分野でいくつかの改善に取り組んでいますが、まだ公にコミットすることはできません.

カスタム プロバイダー インターフェイス (IDataServiceMetadata/QueryProvider) を使用して、WCF DS が行うことのほとんどを完全にカスタマイズすることは可能ですが、これを EF で行うには多くの作業が必要であり、完全に行うことはできない場合があります。繰り返しになりますが、チームは EF プロバイダーのカスタマイズを容易にする方法 (これらのインターフェイスのインボックス実装を公開するなど) を検討していますが、それがいつ利用可能になるかについては約束できません。

ASP.NET Web APIは、より柔軟な OData サービスを作成するためのもう 1 つのオプションですが、EF + DataService よりも多くのコードを記述する必要がある場合があります。

于 2013-02-05T22:31:39.780 に答える