odata深层扩展不起作用

时间:2017-03-10 17:24:44

标签: c# asp.net-web-api odata

我正在尝试对我的一个odata查询(3个级别)执行嵌套扩展,并且无法返回扩展对象。

以下是我的课程:

public class Project
{
    public int ProjectId { get; set; }
    public Manager Manager { get; set; }
    public IEnumerable<ProjectResource> ProjectResources { get; set; }
}

public class ProjectResource
{
    public int ProjectResourceId { get; set; }
    public Employee Employee { get; set; }
    public Project Project { get; set; }
    public IEnumerable<Forecast> Forecasts { get; set; }
}

public class Employee
{
    public int EmployeeId { get; set; }
    public string Name { get; set; }
    public Manager Manager { get; set; }
    public IEnumerable<ProjectResource> ProjectResources { get; set; }
}

public class Manager
{
    public int ManagerId { get; set; }
    public string Name { get; set; }
}

public class Forecast
{
    public int ForecastId { get; set; }
    public ProjectResource ProjectResource { get; set; }
}

以下odata查询有效,并返回Projects及其Managers的列表:

/Projects?$expand=Manager

然后我尝试了这个查询,它起作用了:

/Forecasts?$expand=ProjectResource($expand=Project)

添加另一个扩展级别:

/Forecasts?$expand=ProjectResource($expand=Project($expand=Manager))

我得到一个错误,说我只能扩展2个级别。所以我将其添加到我的查询中并重试:

[EnableQuery(MaxExpansionDepth=0)]

我不再收到错误,但不包括每个Manager的{​​{1}}。我对失踪的想法有所了解吗?

3 个答案:

答案 0 :(得分:3)

我正在努力解决同样的问题。事实证明,在配置期间添加所有实体集允许$expand在2个级别之后正常工作。 像这样添加所有实体集:

builder.EntitySet<Item>("Items");
builder.EntitySet<Product>("Products");
builder.EntitySet<Model>("Models");
builder.EntitySet<Type>("Types");

我还将[EnableQuery(MaxExpansionDepth = 0)]设置为控制器上的属性。

答案 1 :(得分:2)

您需要在配置期间添加所有实体集,以允许$ expand在2个级别之后正常工作。

声称此问题与复杂类型相关的SO问题无效。

希望能帮助他节省一些时间,因此就浪费了2天!

答案 2 :(得分:0)

我已经添加了所有必需的实体集,但是仍然存在第4级问题:(甚至注释了所有实体集,结果是相同的。还添加了[EnableQuery(MaxExpansionDepth = 5)]来执行操作。SQLProfiler显示正确的实体和适当数量的联接,但响应无效。