2016-04-10 89 views
0

我有一個基於C#的OData源,並且遇到$ expand無法工作的問題。所有與StackOverFlow相關的帖子似乎都涉及到OData V4之前的版本,因爲很多控制器方法模式在OData V4下不適用/工作。

我的問題:我有兩個實體Table1和Table2,它們之間存在多對一的關係。 Table1有一個名爲Table2的導航屬性,FK Table2Id用於促進這種關係。

[Serializable, DataContract] 
    public class Table1 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    [DataMember] 
    public Table2 Table2 { get; set; } 
    [DataMember, ForeignKey("Table2")] 
    public int Table2Id { get; set;} 
    } 

    [Serializable, DataContract] 
    public class Table2 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    public string Name { get; set;} 
    } 

當我發送的網址:

http://localhost/OData4/api/Table1s?$expand=Table2 

我得到一個錯誤:

The query specified in the URI is not valid. Could not find a property named 'Table2' on type 'System.Web.OData.Query.Expressions.SelectAllAndExpand_1OfTable1

這裏是我的控制器:

[EnableQuery] 
public IHttpActionResult Get(ODataQueryOptions<Table1> queryOptions) 
{ 
    IQueryable result; 

    // validate the query. 
    try 
    { 
    queryOptions.Validate(_validationSettings); 

    var dataSet = container.Get().AsQueryable(); // I can see Table1.Table2 here 
    result = queryOptions.ApplyTo(dataSet); // result has list of Table1 with Table2 nav property 
    } 
    catch (ODataException ex) 
    { 
    throw new HttpRequestException(ex.Message); 
    } 

    return Ok(result, result.GetType()); 
} 

protected IHttpActionResult Ok(object content, Type type) 
{ 
    Type resultType = typeof (OkNegotiatedContentResult<>).MakeGenericType(type); 
    return Activator.CreateInstance(resultType, content, this) as IHttpActionResult; 
} 

這似乎涉及到ApplyTo鑄造結果變成不是的東西Table1類型,但是這樣的包裝。但是在這個方法中沒有例外,我無法弄清楚問題的實際位置。

我正在使用nuGet軟件包'Microsoft ASP.Net Web API 2.2。爲OData V4.0'V5.9.0。

回答

0

如果我正確地閱讀,我認爲問題駐留在表1中的外鍵的聲明。您已將它列爲名稱'Table2',但其下面的屬性(我想是來自表2的外鍵標識)名爲'Table2ID'。

試試這個:

[Serializable, DataContract] 
    public class Table1 
    { 
    [DataMember, Key] 
    public int Id { get; set } 
    [DataMember] 
    public Table2 Table2 { get; set; } 
    [DataMember, ForeignKey("Table2Id")] 
    public int Table2Id { get; set;} 
    } 

如果您[DataMember, ForeignKey("Table2")]應改爲[DataMember, ForeignKey("Table2Id")]