【问题标题】:Pagination with AspNetCore.OData - missing @odata properties in response使用 AspNetCore.OData 进行分页 - 响应中缺少 @odata 属性
【发布时间】:2019-09-07 18:34:02
【问题描述】:

我正在尝试使用 asp.net core 2.2 和 Microsoft.AspNetCore.OData 7.1.0 实现分页,配置如下:

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":...  
}

但我只得到:

[1,2,3,4,5]

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

【问题讨论】:

  • 您是否尝试过从ODataController 派生控制器?
  • @IlyaChumakov 它没有帮助,但我终于找到了解决方案。

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


【解决方案1】:

终于想通了。

首先它不适用于原始类型,所以我必须使用 Id 属性创建强类型:

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

    public int Id { get; set; }
}

其次,我必须从控制器中删除 ApiController 和 Route 属性。

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());

【讨论】:

  • 天啊,我也遇到了同样的问题,我终其一生都无法弄清楚到底发生了什么。非常感谢分享这个!我可能会在 github 上打开该项目的票,并谈论设置是多么模棱两可......以至于它可能导致这个!
  • Jan Muncinsky:我想知道您是否在 Core 3.1 和 ODataCore 7.4 中尝试过这种模式?我面临同样的问题,并且一直在努力寻找合适的设置组来解决它。 OData 团队缺乏文档/示例是一个持续存在的问题。
  • 我将提供更多关于我处理同一问题的经验的详细信息。核心 3.1 和 OData 核心 7.5.1。 Jan 似乎是正确的:它不适用于原始类型,但在仅返回 IQueryable 结果时似乎也不起作用。相反,返回类型应该是IQueryable&lt;T&gt;。
猜你喜欢
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多