我有一個基於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。