Asp.net web api odata v4,列表<&燃气轮机;不可扩展的属性

Asp.net web api odata v4,列表<&燃气轮机;不可扩展的属性,asp.net-web-api,odata,Asp.net Web Api,Odata,在odata4中是否可以创建以下模型: public class PuppyDogs { public string Name { get; set; } public virtual IList<Bone> Bones { get; set; } } public class Bone { public string ChewType { get; set; } publ

在odata4中是否可以创建以下模型:

    public class PuppyDogs
    {

        public string Name { get; set; }

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

    public class Bone
    {
        public string ChewType { get; set; }

        public int Numberofchews { get; set; }        

    }
公共类PuppyDogs
{
公共字符串名称{get;set;}
公共虚拟IList骨骼{get;set;}
}
公营骨
{
公共字符串类型{get;set;}
公共整数{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", Numberofchews=1 },
                  new Bone{ ChewType = "Hard", Numberofchews=2 }
            };

            mydogs.Add(mydog);
        }
    }

    [EnableQuery]
    public IQueryable<PuppysDog> Get()
    {
        return mydogs.AsQueryable();
    }
}
公共类puppeydogcontroller:ODataController
{
List mydogs=新列表();
专用puppeydogcontroller()
{
如果(mydogs.Count==0)
{
PuppysDog mydog=新的PuppysDog();
mydog.Name=“Fido”;
mydog.Bones=新列表()
{
新骨骼{chowtype=“Soft”,Numberofchews=1},
新骨{chowtype=“Hard”,Numberofchews=2}
};
添加(mydog);
}
}
[启用查询]
公共IQueryable Get()
{
返回mydogs.AsQueryable();
}
}

我可以在不使用expand的情况下包含PuppyDogs的Bones属性吗?默认情况下,骨骼不会返回到客户端。

您的代码中有几点不清楚,例如,实体集PuppyDogs没有密钥,控制器中的命名约定有点关联等等。使用以下代码,它可以完美地工作,请看一看

PuppyDog.cs

public class PuppyDog
{
    [Key]
    public string Name { get; set; }

    public virtual IList<Bone> Bones { get; set; }
}
pupyydogscocontroller.cs

public class PuppyDogsController : ODataController
{
     List<PuppyDog> mydogs = new List<PuppyDog>();

    private PuppyDogsController()
    {
        if (mydogs.Count == 0)
        {
            PuppyDog mydog = new PuppyDog();

            mydog.Name = "Fido";

            mydog.Bones = new List<Bone>()
            {
                new Bone {ChewType = "Soft", Numberofchews = 1},
                new Bone {ChewType = "Hard", Numberofchews = 2}
            };

            mydogs.Add(mydog);
        }
    }

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

是否需要将骨骼设置为实体集?如果不是,您可以尝试将骨骼制作为复杂类型。骨骼不是复杂类型吗?我认为在模型定义中省略[Key]是一种复杂类型?无论哪种方式,List属性都不会显示在客户端上。您的示例确实有效-控制器上的命名约定是什么?您是否将型号名称复数化?PuppyDog变成了PuppyDogsController?请看@sheamus,如果骨骼是父实体,比如说其他实体,比如BoneType或其他什么,那么骨骼会有一个键吗?我找到了相同的。如果向骨骼添加[Key]属性,那么它实际上会从JSON输出中消失。那么,您如何拥有一个带有键的实体集合呢?
public class PuppyDogsController : ODataController
{
     List<PuppyDog> mydogs = new List<PuppyDog>();

    private PuppyDogsController()
    {
        if (mydogs.Count == 0)
        {
            PuppyDog mydog = new PuppyDog();

            mydog.Name = "Fido";

            mydog.Bones = new List<Bone>()
            {
                new Bone {ChewType = "Soft", Numberofchews = 1},
                new Bone {ChewType = "Hard", Numberofchews = 2}
            };

            mydogs.Add(mydog);
        }
    }

    [EnableQuery]
    public IQueryable<PuppyDog> Get()
    {
        return mydogs.AsQueryable();
    }
}
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

        builder.EntitySet<PuppyDog>("PuppyDogs");

        config.MapODataServiceRoute("odata", null, builder.GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
        config.EnsureInitialized();
    }
}
{
    "@odata.context": "http://localhost:21830/$metadata#PuppyDogs",
    "value": [
     {
      "Name": "Fido",
      "Bones": [
         {
           "ChewType": "Soft",
           "Numberofchews": 1
         },
         {
           "ChewType": "Hard",
           "Numberofchews": 2
         }  
        ]
       }
     ]
}