【发布时间】:2019-05-20 12:37:44
【问题描述】:
我使用 OData v7.1 创建了一个新的 .NET Core 2.2 Web 应用。
我已经启动并运行它,并且已经可以使用 $top、$skip、...
我现在正试图让 $count 正常工作,但我完全不知道该怎么做。
我已经尝试了几个链接,它们要么不再编译,要么没有产生我想要的结果。
我有什么:
在 StartUp.cs
中app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
routes.EnableDependencyInjection();
routes.Expand().Select().OrderBy().Filter().MaxTop(null).Count();
});
在我的 Controller 类中:
[EnableQuery]
[HttpGet("[action]")]
public IActionResult All()
{
var assets = _service.GetAllAssets();
return Ok(assets);
}
这将返回所有资产,我可以使用 $top 和 $skip 没问题。现在如何添加 $count=true 或任何其他允许我返回总计数的方法?我究竟做错了什么?
有效的示例网址: http://localhost/api/Assets/All?$top=20&$skip=20
无效的网址: http://localhost/api/Assets/All?$count=true (它返回所有资产)
目前的结果是:
[{Item One}, {Item Two}]
我想要的结果是:
[Count : 4,
Items: [{Item One}, {Item Two}
]
【问题讨论】:
-
OData 应该在 IQueryable 之上工作,并根据需要添加 Select、Where 等。我怀疑
GetAliases返回所有项目的列表而不是IQueryable -
您是否尝试过ASP.NET Core OData announcement 中的OData 示例,尤其是
Query the Resources示例? -
Count() 仅适用于列表或数组。您将 count 放在返回单例的 MaxTop(null) 之后。这就是您收到错误的原因。
-
@PanagiotisKanavos :我在发帖之前已经阅读了该页面。问题是这一行:“.MapODataServiceRoute("odata", "odata", GetEdmModel());"。这会产生此错误:“无法将 'Microsoft.AspNet.OData.Routing.ODataRoute' 与 Endpoint Routing 一起使用。”,因为 Endpoint Routing 已成为 .NET Core 2.2 的标准
-
@StevenLemmens 您应该在问题本身中解释这一点。如果路由从 2.0 开始发生了变化,需要改变的是路由和
Startup.cs,而不是操作。