我有以下复杂类型从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 =儿童不起作用,表示儿童不是导航财产。
谢谢你的帮助!
答案 0 :(得分:1)
从操作中删除ODataQueryOptions<TreeItem> queryOptions
,在操作上添加[EnableQuery]。
[EnableQuery]
public IHttpActionResult GetTreeItems()
{
...
}
感谢。
此外,您的标题不正确。 TreeItem
由您构建为实体类型,而不是复杂类型。实体类型和复杂类型都是结构类型,但实体类型必须具有键,而复杂类型不需要。
===============迭代2 ===============
Children
显式映射为复杂类型。所以,以下代码是不必要的:
builder.EntitySet("TreeItems").EntityType.ComplexProperty(c => c.Children);
如果您使用的是ODataConventionModelBuilder
,请删除.ComplexProperty()
函数调用。
您可以使用$levels
扩展子级别。我构建了一个你可以参考的sample project,我在其中提出了四个查询:
http://localhost/odata/TreeItems
http://localhost/odata/TreeItems?$扩大=儿童
http://localhost/odata/TreeItems?$扩大=儿童($水平= 2)
http://localhost/odata/TreeItems?$扩大=儿童($水平=最大)
所有查询都会返回不同的结果(我在控制器中做了一些更改)。您可以轻松运行此控制台应用程序以检查结果。我认为你可以找到你想要的东西。
如果您对该项目有任何疑虑,请与我们联系。