【发布时间】:2015-02-16 13:56:34
【问题描述】:
我正在构建一个 OData v.4 Web 服务,该服务必须公开从另一个 3rd 方 Web 源检索到的数据,因此该数据与 LINQ 世界中的任何内容都不同,即:没有 IQueryable、没有上下文、没有任何东西..
要走的路似乎是手动处理来自 ODataQueryOptions 的参数并返回简单的项目序列。所以,控制器方法应该是这样的:
class MyMasterEntity {
[Contained]
public IEnumerable<MyDetailEntity> Details { get; set; }
}
// [EnableQuery]
public IEnumerable<MyMasterEntity> Get(ODataQueryOptions<MyMasterEntity> options)
{
// process .FilterQueryOption
// process .SelectExpandQueryOption
// process .SkipQueryOption
// process .TopQueryOption
return myMasterEntityList;
}
这很好用,除了$expand=Details,在这种情况下属性不会在结果响应中扩展,尽管我的逻辑添加它们就好了。
如果添加[EnableQuery] 属性(一开始是没有意义的,因为它与ODataQueryOptions 的整个想法是互斥的),然后扩展开始工作。或者它假装正在工作,因为真正发生的是查询被处理了两次:第一次由我的代码处理,然后在我返回数据后由 OData 机器处理。这可能是可以容忍的(无论如何,我手动进行了昂贵的调用,所以没有什么大的 OData 重试已经准备好的数据),如果不是因为第二次通过诸如 $skip 之类的非确定性操作。 (即:可以根据需要多次应用 $top 以获得相同的结果,但不能使用 $skip 执行此操作)。
正如我从逆向工程相关程序集中了解到的那样,标准扩展代码将实体包装成某种东西,这告诉 JSON 格式化程序发出相应的属性,而不管它们是否实际上在实体内部展开。
也试过了:
- 更改返回类型(IQueryable、IHttpActionResult)
- 在手动展开后但返回之前强制调用
SelectExpandQueryOption.ApplyTo(myMasterEntityList, new ODataQuerySettings())
如何正确展开导航属性?
【问题讨论】:
标签: asp.net-web-api odata