我有一个连接到Entity Framework的OData端点来公开DataServices,但是我想在运行时根据一些元数据调整出来的数据,以使查询比URL更具限制性
例如:
http://services.odata.org/OData/OData.svc/Category(1)/Products $顶部= 2&安培; $的OrderBy =名称
如果这是位于欧洲的用户,我希望返回的产品具有“欧洲”区域,但我更倾向于网址不必由客户端提供过滤器,如: / p>
http://services.odata.org/OData/OData.svc/Category(1)/Products $ top = 2& $ orderby = name& $ filter = Region eq'Europe'
我发现查询拦截器可以用于此类事情,但它是一个适用于大量实体的所有查询的概念,所以我希望有更通用的方法将它应用于所有实体而不是而不是必须在每个实体上指定一个拦截器。
我也在考虑根据用户权限隐藏某些字段,例如,如果某个字段被标记为敏感字段,我可以动态地从查询中删除该字段,或者根据是否允许用户查看结果敏感数据。我认为我上面描述的技术将是这两种情况的解决方案。
修改url可能会被命中,因此我可能会在执行之前访问EF创建并添加或删除项目的表达式树吗?
以防它是相关的我正在使用DataService基类来公开数据:
公共类MyDataService:DataService
这快速而简单但可能难以实现我想要的目标
任何帮助都非常感激 - 即使它只是我想要实现的特定名称,这将有助于研究解决方案
答案 0 :(得分:2)
不幸的是,今天在WCF数据服务中没有一种简单的方法(除了你提到的QueryInterceptors之外)。该团队经常听到对此类功能的请求,我们正在努力在这方面做一些改进,但不能公开承诺。
可以使用自定义提供程序接口(IDataServiceMetadata / QueryProvider)来完全自定义WCF DS的大部分内容,但通过EF执行此操作需要做很多工作,并且可能无法完美地完成。同样,该团队正在研究如何更轻松地定制EF提供程序(例如将这些接口的内置实现公开),但我再也无法承诺何时可以使用。
ASP.NET Web API是创建具有更大灵活性的OData服务的另一种选择,尽管您可能需要编写比使用EF + DataService更多的代码。