Может ли .NET oData DataService принудительно фильтровать дочерние записи? - PullRequest
0 голосов
/ 09 марта 2011

Это должен быть простой сценарий - у меня есть модель данных с отношениями родитель / потомок.Например, скажем, это Orders и OrderDetails - 1 Order -> много OrderDetails.

Я бы хотел представить модель через oData, используя стандартный DataService, но с некоторыми ограничениями.

Во-первых, я должен видеть только мои приказы.Это достаточно просто, используя EntitySetRights.ReadSingle и QueryInterceptor, чтобы убедиться, что порядок на самом деле мой.

Пока все хорошо!Но как можно отобразить связанные записи OrderDetail в фиде oData таким образом, чтобы я мог читать OrderDetails для определенного (читать отдельно) заказа, не предоставляя доступ ко всей таблице OrderDetails?Другими словами, я хочу разрешить читать мои данные

myUrl.com/OrderService.svc/Orders(5)/OrderDetails  <-- Good! My order is #5

, но не все детали

myUrl.com/OrderService.svc/OrderDetails  <-- Danger, Scarry, Keep Out!

Спасибо за помощь!

1 Ответ

0 голосов
/ 09 марта 2011

Это так называемое «сдерживание» - ваш образец точно описан здесь: http://data.uservoice.com/forums/72027-wcf-data-services-feature-suggestions/suggestions/1012615-support-containment-hierarchical-models-in-odata?ref=title Службы данных WCF пока не поддерживают это из коробки.

Теоретически возможно реализовать такое ограничение с помощью специального поставщика LINQ. В вашей реализации LINQ вы можете обнаружить расширение (не так сложно) и в этом случае разрешить его. Но вы можете запретить запросы к самому набору сущностей (также довольно легко распознать). Подробнее о том, как выглядят выражения LINQ, смотрите в этой серии: http://blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx

Это зависит от того, какого провайдера вы хотели использовать изначально. Если у вас уже есть специальный провайдер, это не так сложно. Если у вас был провайдер, основанный на отражении, это можно выложить сверху. Если у вас был EF, это может быть довольно сложно (не уверен, что это вообще возможно).

...