如何在OData v4 .NET中返回包含对象列表的对象?

时间:2018-06-12 08:28:39

标签: asp.net odata

我试图创建一个方法来GET和POST一个包含事务列表的对象。问题似乎是如果列表项包含标有[Key]属性的主键,它们将不再被Microsoft OData框架识别,并立即从OData JSON输出中消失(但在常规REST API上仍然可见)

参考下面的代码,如果我在Bone类中放置[Key] atttribute,那么这里是JSON输出:

{  
    "@odata.context":"http://localhost/odata/$metadata#PuppyDogs",
    "value":[  
        {  
            "Name":"Fido",
            "Bones":[  
                {  
                    "ChewType":"Soft",
                    "Numberofchews":1
                },
                {  
                    "ChewType":"Hard",
                    "Numberofchews":2
                }
            ]
        }
    ]
}

...但是只要将[Key]添加到Bone类,列表就会消失:

{  
    "@odata.context":"http://localhost/odata/$metadata#PuppyDogs",
    "value":[  
        {  
            "Name":"Fido"
        }
    ]
}

如何让一个包含带键的其他对象的对象?到目前为止,我还没有在网上找到任何这方面的工作示例,但我认为这是一个非常常见的用例(例如包含订单项的订单等)。

使用其他人的代码演示:

    public class PuppyDogs
    {
        public string Name { get; set; }

        public IList<Bone> Bones { get; set; }
    }

    public class Bone
    {
        [Key] // if this line is here, the list of Bones disappears from the JSON
        public int BoneID {get;set;}

        public string ChewType { get; set; }
    }

控制器类看起来像:

public class PuppyDogController : ODataController
{
    List<PuppysDog> mydogs = new List<PuppysDog>();

    private PuppyDogController()
    {
        if (mydogs.Count == 0)
        {
            PuppysDog mydog = new PuppysDog();
            mydog.Name = "Fido";
            mydog.Bones = new List<Bone>()
            {
                new Bone{ ChewType = "Soft"},
                new Bone{ ChewType = "Hard"}
            };

            mydogs.Add(mydog);
        }
    }

    [EnableQuery]
    public IQueryable<PuppysDog> Get()
    {
        return mydogs.AsQueryable();
    }
}

0 个答案:

没有答案