使用OData在.NET API上返回嵌套对象

时间:2017-04-04 20:25:10

标签: c# json asp.net-web-api nhibernate odata

我正在使用使用OData的.NET API,我目前在将嵌套对象返回给客户端时遇到问题。

即使我在响应之前在Controller上设置了断点,一切似乎都在起作用。我可以看到将返回的Vendor对象,并且所有信息都已正确填充,但是当我查看JSON响应时,Client收到它只有原始类型和枚举,其他每个属性都不会被序列化到JSON结果。

public class Vendor : IEntity
{
    public virtual int Id { get; set; }
    public virtual VendorAddress PrimaryAddress { get; set; }
    public virtual string VendorName { get; set; }
}

public class VendorAddress : IEntity
{
    public virtual int Id { get; set; }
    public virtual Vendor Vendor { get; set; }
    public virtual Address Address { get; set; }

}

 public class Address : IEntity
{
    public virtual int Id { get; set; }   
    public virtual string Line1 { get; set; }
    public virtual string Line2 { get; set; }     
    public virtual string Country { get; set; }
    public virtual string CountryCode { get; set; }
    public virtual string City { get; set; }
    public virtual string County { get; set; }
    public virtual string StateProvince { get; set; }
    public virtual string ZipCode { get; set; }    
}   

 public SingleResult<Vendor> Get([FromODataUri] int key)
{
    var result = _repository.Query<Vendor>().Where(a => a.Id == key);
    return SingleResult.Create(result);
}

基本上我想返回供应商信息,包括关于JSON结果的PrimaryAddress / Address信息,但似乎无法弄清楚如何。

1 个答案:

答案 0 :(得分:1)

VendorAddressAddress是所谓的导航属性。 您可以在查询中使用$expand来获取它们。 首先在Get方法中添加[EnableQuery]

[EnableQuery]
public SingleResult<Vendor> Get([FromODataUri] int key)

然后以

的形式尝试请求
<serviceUri>/Vendor(1)?$expand=VendorAddress
<serviceUri>/Vendor(1)?$expand=VendorAddress($expand=Address)

你必须添加一行

config.Expand()

中的

WebApiConfig.Register(HTTPConfiguration config)

方法

以下是测试服务的示例请求:

http://services.odata.org/TripPinRESTierService/People('russellwhyte')?$expand=BestFriend($expand=Trips)

以及更多信息供参考:http://www.odata.org/odata-services/

希望这有帮助。