OData V4 ODataQueryOptions和$ expand

时间:2016-04-10 20:37:12

标签: asp.net-web-api2 odata-v4

我有一个基于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

我收到错误:

  

URI中指定的查询无效。找不到名为' 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软件包&#39; Microsoft ASP.Net Web API 2.2。对于OData V4.0&#39; V5.9.0。

1 个答案:

答案 0 :(得分:0)

如果我正确阅读,我认为问题在于您在Table1中声明外键。你将它列为名称'Table2',但它下面的属性,我想象的是表2中的外键id,被命名为'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")]

的位置