Web API OData $ expand不返回复杂类型

时间:2013-11-22 05:31:23

标签: entity-framework asp.net-web-api odata

域名模型:

public class Course
{
   public int CourseId { get; set; }
   public virtual ICollection<TeeSet> TeeSets { get; set; }
}
public class TeeSet
{
    public int TeeSetId { get; set; }
    public int CourseId { get; set; }
    public CourseRating MensRating { get; set; }
}

当课程扩展到包含TeeSets时,以下查询不包括CourseRating复杂类型 GET / api / courses?$ expand = TeeSets

public class CoursesController : ApiController
{
    [Queryable]
    public IQueryable<Course> Get()
    {
        return _uow.Courses.GetAll();
    }
}

JSON序列化结果不包含MensRating复杂类型(CourseRating):

[
  {
"teeSets": [
  {
    "teeSetId": 1,
    "courseId": 7
  },
  {
    "teeSetId": 2,
    "courseId": 7
  }
   ],
   "courseId": 7,
  }
]

但是,针对DbContext的快速测试会在TeeSets上返回CourseRating复杂类型,就像我期望的那样:

[TestMethod]
public void Get_Course_With_TeeSets()
{
    using (CoursesContext ctx = new CoursesContext())
    {
        var courses = ctx.Courses.Where(x => x.CourseId == 7).Include(x => x.TeeSets).FirstOrDefault();
    }
}

使用了Entity Framework 6和Web API 2.

2 个答案:

答案 0 :(得分:0)

您应该像MensRating

那样展开GET /api/courses?$expand=TeeSets/MensRating

当我们使用QueryableAttribute构建支持ApiController的隐式EDM模型时,我们将每个类型视为实体类型,以绕过OData V3限制,复杂类型无法引用实体类型。而且,这意味着您必须明确地扩展每个非基本类型。

答案 1 :(得分:0)

MensRating上添加AutoExpand属性可以使其工作。