首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OData V4 ODataQueryOptions和$expand

OData V4 ODataQueryOptions和$expand
EN

Stack Overflow用户
提问于 2016-04-10 20:37:11
回答 1查看 864关注 0票数 0

我有一个基于C#的OData源代码,我在让$expand工作时遇到了问题。StackOverFlow的所有相关文章似乎都提到了OData之前的V4,因为许多控制器方法模式只是在OData V4下不适用/工作。

我的问题是:我有两个实体-- Table1和Table2,它们之间存在着多对一的关系。Table1有一个名为Table2的导航属性,FK Table2Id用于促进这种关系。

代码语言:javascript
复制
  [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时:

代码语言:javascript
复制
http://localhost/OData4/api/Table1s?$expand=Table2

我收到一个错误:

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

这是我的控制器:

代码语言:javascript
复制
[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 2.2,用于OData V4.0‘V5.9.0。

EN

回答 1

Stack Overflow用户

发布于 2016-06-14 15:05:51

如果我正确阅读,我认为问题存在于您在Table1中的外键声明中。表2列出了它的名称,但是下面的属性(我想是表2中的外键id )被命名为'Table2ID‘。

试试这个:

代码语言:javascript
复制
  [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")]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36535285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档