我有一个 OData 端点连接到 Entity Framework 以公开 DataServices,但我想在运行时根据某些元数据来调整输出的数据,以使查询比 URL 更具限制性

例如:

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

如果这是位于欧洲的用户,我希望返回具有“欧洲”区域的产品,但我希望 url 不必具有客户端提供的过滤器,例如:

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

我发现查询拦截器可以用于这类事情,但它是一个适用于对大量实体的所有查询的概念,所以我希望有一种更通用的方法将它应用于所有实体而不是必须在每个实体上指定一个拦截器。

我也在考虑根据用户权限隐藏某些字段,例如,如果某个字段被标记为敏感,我可以根据是否允许用户查看敏感数据从查询或结果中动态删除该字段。我认为我上面描述的技术将是这两种情况的解决方案。

修改 url 可能会被击中和错过,所以也许我可以访问表达式树 EF 创建并在它执行之前添加或删除项目?

以防万一,我使用 DataService 基类来公开数据:

公共(public)类 MyDataService :数据服务

这既快速又简单,但可能很难实现我想要的

非常感谢任何帮助 - 即使它只是我试图实现的特定名称,也将有助于研究解决方案

最佳答案

不幸的是,目前在 WCF 数据服务中没有一种简单的方法来做到这一点(除了 QueryInterceptors,正如你提到的)。团队经常听到此类功能的请求,我们正在这方面进行一些改进,但目前还不能公开 promise 任何事情。

可以使用自定义提供程序接口(interface) (IDataServiceMetadata/QueryProvider) 来完全自定义 WCF DS 的大部分功能,但通过 EF 执行此操作需要大量工作,并且可能无法完美完成。同样,该团队正在寻找使自定义 EF 提供程序更容易的方法(例如公开这些接口(interface)的内置实现),但我再次无法确定何时可用。

ASP.NET Web API 是另一种创建 OData 服务的选项,它具有更大的灵活性,但与 EF + DataService 相比,您可能需要编写更多代码。

关于.net - OData 和 Entity Framework 向所有查询添加额外的 where 子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13798456/

10-13 08:00
查看更多