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

时间:2015-09-28 07:46:24

标签: c# odata

我有以下复杂类型从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(&#34; TreeItems&#34;)。EntityType.ComplexProperty(c =&gt; c.Children);

当我转到此网址时: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"
    }
  ]
}

如何让儿童名单完全显示,包括所有级别?

$ expand =儿童不起作用,表示儿童不是导航财产。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

从操作中删除ODataQueryOptions<TreeItem> queryOptions,在操作上添加[EnableQuery]。

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

感谢。

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

===============迭代2 ===============

  1. 正如我所说,您无法将Children显式映射为复杂类型。所以,
  2. 以下代码是不必要的:

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

    如果您使用的是ODataConventionModelBuilder,请删除.ComplexProperty()函数调用。

    1. 您可以使用$levels扩展子级别。我构建了一个你可以参考的sample project,我在其中提出了四个查询:

      http://localhost/odata/TreeItems

      http://localhost/odata/TreeItems?$扩大=儿童

      http://localhost/odata/TreeItems?$扩大=儿童($水平= 2)

      http://localhost/odata/TreeItems?$扩大=儿童($水平=最大)

    2. 所有查询都会返回不同的结果(我在控制器中做了一些更改)。您可以轻松运行此控制台应用程序以检查结果。我认为你可以找到你想要的东西。

      如果您对该项目有任何疑虑,请与我们联系。