Asp.net web api WebApi Odata返回复杂类型

Asp.net web api WebApi Odata返回复杂类型,asp.net-web-api,odata,complextype,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;

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

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;}
}
公共类产品
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共类供应商
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共IEnumerable乘积{get;set;}
}
现在,我想从我的WebApi odata控制器返回供应商及其所有产品。但我似乎无法让它工作,因为它只是返回供应商并有效地剥离产品信息。控制器方法是一个简单的Get和GetEntityByKey。 我的配置如下

 ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
            modelBuilder.EntitySet<supplier>("supplier");
            modelBuilder.EntitySet<product>("product");
ODataModelBuilder modelBuilder=新ODataConventionModelBuilder();
modelBuilder.EntitySet(“供应商”);
modelBuilder.EntitySet(“产品”);

我是否缺少一个配置选项来实现此功能?

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

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

如果您包括请求URI和您要返回的负载,我可以更清楚地了解您的情况


关于术语的简要说明:OData中的“复杂类型”通常指没有标识的结构类型。一个典型的例子是地址类型,它是一种值类型,具有多个组件(城市、国家、街道等),但不需要有自己的键。这里所说的是实体之间的导航。

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

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

如果您包括请求URI和您要返回的负载,我可以更清楚地了解您的情况


关于术语的简要说明:OData中的“复杂类型”通常指没有标识的结构类型。一个典型的例子是地址类型,它是一种值类型,具有多个组件(城市、国家、街道等),但不需要有自己的键。这里讨论的是实体之间的导航。

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

2) 通过以下方式在单个实体上支持$select和$expand 查询属性


可能尝试使用QueryableAttribute。看这里:

2) 通过以下方式在单个实体上支持$select和$expand 查询属性


基于Jen的回答,NuGet上的Web API OData的第一个版本不支持$expand,但它目前在我们的夜间版本中可用,应该在下一个版本中可用。有关如何访问我们的夜间睡眠的更多信息,请参阅此博客帖子:谢谢您回复我。至少我知道它不是一个配置选项,它的odata本身剥离了额外的“产品”信息,而不是像在非ODataWebAPI中那样将其包含在返回的Json中。下一个版本有发布日期吗?@YoussefMoussaoui我已经获得了夜间版本,但无法获得一个简单的示例,请注意,我使用的是fiddler composer。webapi控制器中的代码如下所示:
protectedoverride supplier GetEntityByKey(int key){supplier s=new supplier(){Name=“Test”,ID=1};s.products=new List(){new product(){ID=1,Name=“P1”},new product(){Name=“P2”,ID=2};返回s;}
@YoussefMoussaoui-返回的JSON不包含产品信息,只包含供应商信息。调试控制器GetEntityKey我可以看到返回的值包含产品,但是当查看Fiddler中的Json时,产品仍然被剥离。它对Get(返回的供应商和产品)正常工作,但对GetEntityByKey不正常,因为它只返回供应商。感谢您在这方面花费的时间。好的,它对Get有效但不能通过key获取的原因是Get被标记为Queryable属性,而您的Get没有。实际上,我建议您从ODataController而不是EntitySetController派生,复制您需要的任何代码。并使用Queryable属性标记Get by键。现在还没有太多的文档,因为我们还没有发布任何东西,但是如果您想创建一个单独的sta