$在IQueryable之外扩展

时间:2016-04-19 14:50:01

标签: c# asp.net-web-api odata asp.net-web-api2

我似乎有一个不寻常的需要,我需要能够扩展对象,但我不能使用标准的IQUeryable来做到这一点。

我正在使用EntityFramework和AutoMapper从数据库实体投影到API数据对象,然后我通过OData公开。这有一个问题,它限制了我可以做的事情 - 对于AutoMapper可以ProjectTo的那些元素。

这通常不是问题 - 如果Api对象中的项目是数据库的一部分。我现在有某些对象,我必须(有时可选)添加来自其他来源的数据。我们通常谈论仅存储在内存中的数据(如对象的错误详细信息,包括堆栈跟踪或某些运行时统计信息)。

因此,我需要找到一种操作(过滤)查询的方法 - 实际上更重要 - 在单实体GET操作中处理$ expand(虽然也支持multi get,但我可以处理这个通过使用ODataQueryDetails)。

对于单项查询,我有一个控制器方法,如:

  

获取([FromODataUri] Guid密钥){

这让我根本无法访问ODataQueryDetails。在这种情况下,任何人都知道如何获取这些查询详细信息吗?

整体文档"自定义查询"元素并不是特别大 - 通常似乎假设某人是"只是玩一些IQueryable界面" - 不考虑您可能需要进行多阶段处理或执行混合内存和数据库数据的操作。

注意:Web API OData: How do you $expand on a single entity?不是重复的 - 这是一个带有参数名称的问题(名称需要密钥)并且不够深入。

1 个答案:

答案 0 :(得分:1)

如果您只是将参数添加到Get,如下所示,Web API参数绑定将为该方法提供值。设Thing为控制器处理的实体类型。

public IHttpActionResult Get([FromODataUri] Guid key, ODataQueryOptions<Thing> opts)

请注意,您需要指定ODataQueryOptions的通用版本,否则您将获得例外。

这将为您提供一个表示当前请求的查询选项的对象,但您将无法修改选项(没有任何有趣的属性具有公共设置者)。似乎有很多开发人员需要拦截和修改查询选项,但目前还没有开箱即用的解决方案。请参阅当前定位到5.1.0版本的open issue on Github。有关在控制器方法中修改查询选项的最新实践,请参阅OData V4 modify $filter on server side