使用AspNetCore.OData分页-响应中缺少@odata属性

时间:2019-04-17 13:33:33

标签: c# asp.net-core pagination odata asp.net-core-2.0

我正在尝试使用以下配置对asp.net core 2.2和Microsoft.AspNetCore.OData 7.1.0进行分页:

BOOK1-01/
BOOK1-01/BOOK1-01_summary.txt
BOOK1-01/BOOK1-01_chapter1/BOOK1-01_chapter1.txt

为此,我有一个测试控制器:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOData();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc(b =>
        {
            b.EnableDependencyInjection();
        });
    }
}

调用端点时,我希望得到如下响应:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    [EnableQuery(PageSize = 5)]
    public IQueryable<int> Get()
    {
        return new int[] { 1,2,3,4,5,6,7,8,9,10 }.AsQueryable();
    }
}

但是我只能得到:

{  
  "@odata.context":...,
  "value":[1,2,3,4,5],
  "@odata.nextLink":...  
}

那我如何获得那些额外的@odata属性?

1 个答案:

答案 0 :(得分:0)

最后我想出了办法。

首先,它不适用于原始类型,因此我不得不使用ID属性创建一个强大的类型:

public class Value
{
    public Value(int id)
    {
        Id = id;
    }

    public int Id { get; set; }
}

第二,我必须从控制器中删除ApiControllerRoute属性。

public class ValuesController : ControllerBase
{
    [HttpGet]
    [EnableQuery(PageSize = 5)]
    public IQueryable<Value> Get()
    {
        return Enumerable.Range(1, 10).Select(i => new Value(i)).AsQueryable();
    }
}

最后注册odata端点:

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Value>("Values");
app.UseOData("odata", "api", builder.GetEdmModel());