【问题标题】:OData V4 ODataQueryOptions and $expandOData V4 ODataQueryOptions 和 $expand
【发布时间】:2016-04-10 20:37:11
【问题描述】:

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

当我发送 URL 时:

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

我收到一个错误:

URI 中指定的查询无效。在类型“System.Web.OData.Query.Expressions.SelectAllAndExpand_1OfTable1”上找不到名为“Table2”的属性

这是我的控制器:

[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。

【问题讨论】:

    标签: asp.net-web-api2 odata


    【解决方案1】:

    如果我没看错,我认为问题在于您在表 1 中声明的外键。您已将其以名称“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")]

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 1970-01-01
      • 2017-02-27
      • 2015-07-29
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 2015-04-24
      • 2013-09-23
      相关资源
      最近更新 更多