OData深度展开不起作用

3

我正在尝试对我的一个OData查询执行嵌套扩展(三层),但无法获取扩展对象。

这是我的类:

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))

我收到一个错误,说只能展开两层。因此,我将以下内容添加到我的查询并重试:

[EnableQuery(MaxExpansionDepth=0)]

我不再遇到错误,但每个项目的Manager未被包含。你有什么想法我缺少了什么?
3个回答

8

我也遇到了同样的问题。事实证明,在配置期间添加所有实体集使得$expand 在两个级别后能够正常工作。 像这样添加所有实体集:

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

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


4

在配置中添加所有实体集,允许$expand在2个级别后正常工作。

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

希望它能帮助节省某人的时间,只因为这个问题浪费了我2天!


这绝对是正确的答案,当Othman说“所有”实体集时,他的意思是全部。不要忘记任何在多对多关系/导航属性中充当“连接”的实体。之后,您将能够查询超过2层深度的内容。在我找到这个答案之前,我花了半天时间。谢谢Othman。 - Neil Watson

0

我已经添加了所有所需的实体集,但是仍然遇到第四层的问题 :( 即使注释掉所有实体集,结果也是一样的。同时在操作中添加了[EnableQuery(MaxExpansionDepth = 5)]。 SQL Profiler显示正确的实体和适当数量的连接,但响应无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接