Web Api ODATA 控制器中的层次复杂类型

4

我需要从 Web Api ODATA 控制器返回以下复杂类型:

public class TreeItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<TreeItem> Children { get; set; }
    }

这是控制器方法:
// GET: odata/TreeItems
public IHttpActionResult GetTreeItems(ODataQueryOptions<TreeItem> queryOptions)
        {
            // validate the query.
            try
            {
                queryOptions.Validate(_validationSettings);
            }
            catch (ODataException ex)
            {
                return BadRequest(ex.Message);
            }

            var treeItems = new List<TreeItem>();
            treeItems.Add(new TreeItem() { Id = 1, Name = "Geleiding", Children = new List<TreeItem>() { new TreeItem(){ Id=4, Name="Item1-1", Children=new List<TreeItem>()} } });
            treeItems.Add(new TreeItem() { Id = 2, Name = "Item 2", Children = new List<TreeItem>() });
            treeItems.Add(new TreeItem() { Id = 3, Name = "Item 3", Children = new List<TreeItem>() });
            return Ok<IEnumerable<TreeItem>>(treeItems);
        }

在WebApiConfig中: builder.EntitySet("TreeItems").EntityType.ComplexProperty(c => c.Children);
当我访问这个URL时:http://localhost:50997/odata/TreeItems 我会得到以下响应:
{
  "odata.metadata":"http://localhost:50997/odata/$metadata#TreeItems","value":[
    {
      "Children":{
        "Capacity":4
      },"Id":1,"Name":"Geleiding"
    },{
      "Children":{
        "Capacity":0
      },"Id":2,"Name":"Item 2"
    },{
      "Children":{
        "Capacity":0
      },"Id":3,"Name":"Item 3"
    }
  ]
}

如何获取包括所有可能级别的 Children 列表? $expand=Children 不起作用,提示 Children 不是一个导航属性。
感谢您的帮助!
1个回答

2

ODataQueryOptions<TreeItem> queryOptions 从操作中移除,将 [EnableQuery] 添加到操作上。

[EnableQuery]
public IHttpActionResult GetTreeItems()
{
 ...
}

谢谢。

此外,你的标题不正确。你建立的TreeItem是实体类型,而不是复杂类型。实体类型和复杂类型都是结构类型,但实体类型必须有键,而复杂类型则不需要。

===============第二轮迭代 ===============

  1. 正如我所说,你不能将Children明确映射为复杂类型。因此,

以下代码是不必要的:

builder.EntitySet("TreeItems").EntityType.ComplexProperty(c => c.Children); 

如果您正在使用 ODataConventionModelBuilder,只需删除 .ComplexProperty() 函数调用即可。
您可以使用 $levels 来展开 Children 的子级。我创建了一个示例项目供您参考,其中提供了四个查询:
- http://localhost/odata/TreeItems - http://localhost/odata/TreeItems?$expand=Children - http://localhost/odata/TreeItems?$expand=Children($levels=2) - http://localhost/odata/TreeItems?$expand=Children($levels=max)
所有查询将返回不同的结果(我在控制器中进行了一些更改)。您可以轻松运行此控制台应用程序以检查结果。我确信您可以找到所需内容。
如果您对该项目有任何疑问,请告诉我。

好的,感谢澄清。然而,您的建议并没有改变任何事情,我仍然无法获取任何子项。还有其他建议吗? - JurgenW
你的更改确实给了我一个带有子节点的树!我不得不使用查询 http://localhost:50997/odata/TreeItems?$expand=Children/Children/Children。当我尝试使用您的级别参数时,它不被支持。我需要做其他什么才能使用它吗? - JurgenW
我觉得我需要安装一个更新版本的ODATA WebAPI:http://blogs.msdn.com/b/odatateam/archive/2014/09/12/announcing-the-release-of-web-api-odata-5-3.aspx - JurgenW

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