2013-05-30 64 views
1

我有一个简单的数据模型由两个实体的WebAPI的OData返回复杂类型

public class product 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
} 

public class supplier 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public IEnumerable<product> products {get;set;} 
} 

的现在,从我的WebAPI的OData控制器我想与他们所有的产品退回供应商。但我似乎无法得到这个工作,它只是返回供应商,并有效地剥离了产品信息。控制器方法是一个简单的Get和GetEntityByKey。 我的配置如下。

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
      modelBuilder.EntitySet<supplier>("supplier"); 
      modelBuilder.EntitySet<product>("product"); 

是否有一个配置选项我错过了让它工作?

回答

1

你没有提到你用来获取供应商实体的URI,但我会假设它看起来像这样:http://.../ServiceRoot.svc/supplier(1)。在OData中默认情况下,导航属性不会扩展;也就是说,默认情况下,要求供应商不会包含链接产品的ID和名称,除非您通过$expand查询选项明确要求供应商。例如:http://.../ServiceRoot.svc/supplier(1)?$expand=products

如果您不扩展导航属性,那么供应商的products属性将显示为产品实体的链接集合。如果您在响应有效内容中看不到产品的链接,可能是因为您使用的是新的v3 JSON格式的OData,可能会忽略遵循常规OData URI约定的导航链接(因为客户端可以生成这些链接本身)。

如果您包含请求URI和有效载荷,那么您可以更清楚地了解您的情况。

有关术语的简要说明:OData中的“复杂类型”通常指的是没有身份的结构类型。一个典型的例子可能是地址类型,它是一个值类型,它有多个组件(城市,国家,街道等),但不需要拥有自己的密钥。你在这里讨论的是实体之间的导航。

+0

要在Jen的答案上构建,NuGet的第一个Web API OData版本不支持$ expand,但它目前在我们的夜间版本中可用,并应在下一版本中提供。有关如何访问我们的夜生活的更多信息,请参阅此博客文章:http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web-stack- nuget-packages-with-vs-2012-rc.aspx –

+0

感谢您回复我。至少我知道它不是一个配置选项,它的odata本身除去了额外的“产品”信息,而不是将它包含在返回的Json中,就像在非odata WebApi Get中一样。下一个版本是否有发布日期? –

+0

@YoussefMoussaoui我已经获得了每晚构建,但无法获得一个简单的示例工作,请注意我正在使用fiddler composer http:// mywebsite:port/odata/suppler(1)?$ expand = products。 webapi控制器中的代码如下所示:protected override supplier GetEntityByKey(int key) {s = new supplier(){Name =“Test”,ID = 1}; s。products = new list (){new product(){ID = 1,Name =“P1”},new product(){Name =“P2”,ID = 2}}; return s; }' –

0

也许尝试使用QueryableAttribute。看看这里:

Expand support

2)支持$选择和$通过 QueryableAttribute单机构拓展。