WebApi Odata返回复杂类型

时间:2013-05-30 18:50:35

标签: asp.net-web-api odata complextype

我有一个由两个实体组成的简单数据模型

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");

我是否缺少配置选项以使其正常工作?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

Expand support

  

2)通过支持单个实体的$ select和$ expand   QueryableAttribute。