OData吞下导航属性

时间:2016-04-26 15:50:14

标签: odata asp.net-web-api2

我有一个OData控制器的问题,与我拥有的其他控制器相比有点不寻常。它是第一个完全从内存中工作的人 - 没有涉及数据库。

返回的实体是:

public class TrdRun {

    [Key]
    public Guid Identity { get; set; }

    public TrdTrade [] Trades { get; set; }

TrdTrade也是一个实体集(如果查询针对数据库)。但是在这种特殊情况下,我希望返回从运行中关联为活动的所有交易,并且我这样做而不进入数据库。

我的问题?以下代码:

  [ODataRoute]
    public IEnumerable<Reflexo.Api.TrdRun> Get(ODataQueryOptions options) {
        var instances = Repository.TrdInstance.AsEnumerable();
        var runs = new List<Reflexo.Api.TrdRun>();
        foreach (var instance in instances) {
            runs.Add(Get(instance.Identifier));
        }
        return runs;
    }

正确配置运行以初始化交易 - 但WebApi决定吞下它们。

有什么方法可以将其配置为返回数据&#34;如给定&#34;没有进一步过滤?我知道AutoExpandAttribute(我希望避免使用它 - 我不希望标记有OData属性的API类),但我没有启用Query,所以我希望返回数据在我设置时返回。 / p>

1 个答案:

答案 0 :(得分:1)

Trades属性的值未被序列化,因为ODataMediaTypeFormatter的默认行为是不遵循导航属性,无论内存中是什么。您可以通过在请求的查询字符串中使用$expand或在类定义中的AutoExpandAttribute属性上使用Trades来覆盖此行为,但这两种方法都需要使用{{来装饰控制器方法1}}。

如果您不想这样做,您仍然可以通过编程方式在服务配置中指定EnableQueryAttribute的自动扩展,如下所示:

Trades

次要问题:使用编程方法,如果客户端请求完整元数据(例如// Let builder be an instance of ODataModelBuilder or a derived class. builder.EntityType<TrdRun>().CollectionProperty(r => r.Trades).AutoExpand = true; 标头中的odata.metadata=full),则OData序列化程序将包含完整元数据在自动展开的对象中。