OData:找不到以继承类型命名的属性

时间:2015-01-08 09:33:45

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

对于我的例子,我有两个班级

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string CountryCode { get; set; }
}

public class Customer : Location
{
    public string BankAccountNumber { get; set; }
    public string BankSortCode { get; set; }
}

在我的查询中,我将返回所有位置和客户。

http://localhost:80/odata/Location?select=Id,Name,Town

但是,如果我尝试在客户中选择任何内容(编辑:所以我想要所有位置,但如果位置也是客户,则需要银行帐号),我收到错误。

http://localhost:80/odata/Location?select=Id,Name,Town,BankAccountNumber

"The query specified in the URI is not valid. Could not find a property named 'BankAccountNumber' on type 'MyNamespace.Location'."

有没有办法在继承类型时选择字段而不选择全部?感谢。

2 个答案:

答案 0 :(得分:2)

您不仅应该添加类型名称,还应该添加该类型的名称空间。 例如: http://services.odata.org/TripPinWebApiService/People('russellwhyte')/Trips(1001)/PlanItems/ODataSamples.WebApiService.Models.Flight?$select=StartsAt

Flight类型继承自PlanItem类型。 ODataSamples.WebApiService.Models是名称空间。

有关派生类型的更多详细信息,如果您发现http://www.odata.org/getting-started/advanced-tutorial/太长而无法阅读,请参阅spec一些实例。

答案 1 :(得分:1)

根据OData.org,有两个选项可用于查询派生类型:

  1. ~/Location!Customer/
  2. ~/Location/OfType('Customer')
  3. 所以你的查询应该是这样的:

    http://localhost:80/odata/Location!Customer?select=Id,Name,Town,BankAccountNumber
    

    http://localhost:80/odata/Location/OfType('Customer')?select=Id,Name,Town,BankAccountNumber
    

    /编辑: QianLi指出,上面的博客条目是指OData V2。在Odata4中,使用以下语法访问继承的类型:

    http://host/service/BaseType/Model.SubType
    

    参考:http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html#_Toc372793786