C# 如何在ASP.NET Core中的OData中导航/配置从复杂类型到实体类型的导航?

C# 如何在ASP.NET Core中的OData中导航/配置从复杂类型到实体类型的导航?,c#,asp.net-core,odata,asp.net-core-3.1,C#,Asp.net Core,Odata,Asp.net Core 3.1,标题基本上是我的问题,比如说我有这样的课程 公共类ContrivedComplexClass { 公共字符串stringy{get;set;} 公共ContractEntityClass ContractEntityClass{get;set;} } 公共类contriveEntityClass { 公共Guid Id{get;set;} 公共int inty{get;set;} } 我的控制器动作如下 [HttpGet] [ODataRoute(“GetContrrivedComplexCl

标题基本上是我的问题,比如说我有这样的课程

公共类ContrivedComplexClass
{
公共字符串stringy{get;set;}
公共ContractEntityClass ContractEntityClass{get;set;}
}
公共类contriveEntityClass
{
公共Guid Id{get;set;}
公共int inty{get;set;}
}
我的控制器动作如下

[HttpGet]
[ODataRoute(“GetContrrivedComplexClass()”)]
公共异步虚拟任务GetControlvedComplexClass()
{
等待任务。延迟(10);
ContrivedComplexClass ContrivedComplexClass=新ContrivedComplexClass(){stringy=“asdf”,ContrivedEntityClass=新ContrivedEntityClass(){Id=Guid.NewGuid(),inty=3};
返回设计的ComplexClass;
}
我的edm模型是这样配置的

var builder = new ODataConventionModelBuilder(serviceProvider);
builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id);
builder.Function("GetContrivedComplexClass").Returns<ContrivedComplexClass>();
它只返回复杂类型的属性,如

{"@odata.context":"https://localhost:5001/odata/$metadata#WebPortal.ContrivedComplexClass","stringy":"asdf"}

有人知道我应该如何查询或配置它吗?

将您的EDM模型配置为:

private static IEdmModel GetEdmModel()
{​​​​
    var builder = new ODataConventionModelBuilder();
    builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id); ;
    var function = builder.Function("GetContrivedComplexClass");
    function.ReturnsFromEntitySet<ContrivedComplexClass>("GetContrivedComplexClass");
    return builder.GetEdmModel();
}​​​​
a使用URL:

https://localhost:5001/odata/GetContrivedComplexClass()?$Expand=ContrivedEntityClass
控制器:

[HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{​​​​
    await Task.Delay(3);
    ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass
    {​​​​
        Id = 1,
        stringy = "asdf",
        ContrivedEntityClass = new ContrivedEntityClass()
        {​​​​
            Id = Guid.NewGuid(),
            inty = 3
        }​​​​
    }​​​​;
    return contrivedComplexClass;
}​​​​
[HttpGet]
[ODataRoute(“GetContrrivedComplexClass()”)]
公共异步虚拟任务GetControlvedComplexClass()
{​​​​
等待任务。延迟(3);
ContrivedComplexClass ContrivedComplexClass=新ContrivedComplexClass
{​​​​
Id=1,
stringy=“asdf”,
contriveEntityClass=新contriveEntityClass()
{​​​​
Id=Guid.NewGuid(),
inty=3
}​​​​
}​​​​;
返回设计的ComplexClass;
}​​​​
结果:


谢谢!我想尝试在复杂类型上添加Id,但没有想到从集合部分返回。
https://localhost:5001/odata/GetContrivedComplexClass()?$Expand=ContrivedEntityClass
[HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{​​​​
    await Task.Delay(3);
    ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass
    {​​​​
        Id = 1,
        stringy = "asdf",
        ContrivedEntityClass = new ContrivedEntityClass()
        {​​​​
            Id = Guid.NewGuid(),
            inty = 3
        }​​​​
    }​​​​;
    return contrivedComplexClass;
}​​​​