c# - 使用 AspNetCore.OData 进行分页 - 响应中缺少 @odata 属性
问题描述
我正在尝试使用 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 属性呢?
解决方案
最后我想出了如何去做。
首先,它不适用于原始类型,因此我必须使用 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());
推荐阅读
- azure - 在存储帐户中授予“存储 blob 数据贡献者”的应用程序角色
- vba - 如何从模板填充电子邮件的发件人、收件人、抄送?
- ruby-on-rails - 如何从数组中的控制器获取 ID
- makefile - glibc-2.14 make error: 遇到 shlib.lds 语法错误
- php - 如何每 24 小时从 .txt 文件中获取字符串?
- python - 尝试使用 Peewee (python) 连接到 Microsoft SQL 数据库
- shell - 如何将文本文件中的参数逐行传递给包含在字符串中的命令
- apache-kafka - 重新平衡分区时 Apache Kafka 代理的 OOM
- networking - 无法从 WSL2 访问网络
- mysql - SQL Groupby -- 自定义聚合函数:最大值减去每个组中不同的值