2011-03-09 55 views
0

這應該是一個簡單的場景 - 我有一個父/子關係的數據模型。舉例來說,假設它是Orders和OrderDetails - 1 Order - >許多OrderDetails。.NET oData DataService可以強制篩選子記錄嗎?

我想通過使用標準DataService的oData公開模型,但有一些限制。

首先,我應該只看到我的訂單。這很簡單,使用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! 

感謝您的幫助!

回答

0

這就是所謂的「遏制」 - 您的示例在此處完全描述: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,這可能相當棘手(不確定是否有可能)。