我有一个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>
答案 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序列化程序将不包含完整元数据在自动展开的对象中。