c# - 如何在 .NET Core 5.0 WebAPI 解决方案中启用完整的 OData 功能?
问题描述
我无法让 OData 在新的 .NET Core WebAPI 解决方案 (.NET 5.0) 中工作。
我通过标准“/api/entity”获取数据并使用自定义过滤器,但我更喜欢使用 OData 内置的 $select、$filter、$count、$metadata 等功能。
我为 Microsoft.AspNetCore.OData v7.5.8 添加了 nuget 包,并将以下内容添加到我的 Startup.cs:
ConfigureServices()...
services.AddOData();
Configure()...
endpoints.MapODataRoute("odata", "odata", GetEdmModel()).Select().Filter().Expand().Count();
以及 EDM 模型方法:
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new();
builder.EntitySet<Event>("Events");
return builder.GetEdmModel();
}
一切都会编译,如果我点击[rooturl]/odata
,我会看到我的实体,所以我看到它基本上可以正常工作(我认为)。
但是,如果我去:[rooturl]/odata/events(1)
我找不到页面......但是,如果我使用默认[rooturl]/api/events/1
路由,它会完美运行。
这是我在构建无数 .NET Standard WebForms、WCF、MVC 和 WebAPI 解决方案之后的第一个 .NET Core WebAPI。我确定我只是错过了一些简单的东西......但我不知道是什么。
我希望能够像这样使用 OData:
[rooturl]/odata/Events?$top=10
[rooturl]/odata/Events?$filter=name eq "foo"
[rooturl]/odata/Events?$select=id,name,status
在 .NET Standard MVC 中,OData 功能立即可用。如何使用 .NET Core 获得它?
任何人都有关于添加什么以正确连接的建议?
提前谢谢了。
解决方案
在参考了我的一个旧 WebAPI 解决方案(.NET Framework 4.8 MVC)之后,我想通了。值得庆幸的是,大多数旧模式仍然适用于 .NET Core。
为可能遇到相同问题的人发布解决方案。
Startup.cs 需要以下代码:
ConfigureServices()...
services.AddOData();
Configure()...
// removed app.UseUseMvc()...replaced with this...
app.UseEndpoints(endpoints =>
{
//endpoints.EnableDependencyInjection();
endpoints.Select()
.OrderBy()
.Filter()
.SkipToken()
.MaxTop(null)
.Expand()
.Count();
endpoints.MapODataRoute("api", "api", GetEdmModel());
});
GetEdmModel()...
ODataConventionModelBuilder builder = new();
var events = builder.EntitySet<Events>("Events");
return builder.GetEdmModel();
在控制器上:
为方法添加注释[EnableQuery]
。将输出设置为IQueryable<Events>
(并确保返回集合AsQueryable()
。
这成功了,现在我看到了这个集合所需的所有 OData 选项。
推荐阅读
- sql-server - 在代理作业中运行 ssis 包,而两者都在不同的机器上
- node.js - 如果我使用 http 状态代码 302 向“/sell”发出 GET 请求,为什么我总是被重定向到“/”?
- typescript - Typescript:获取泛型类型的类型
- angular - ionic 3 [object object] 无法在 Android P 中解析数据
- django - 如何在 Python 中访问动态生成的元组?
- java - 为什么当我打开我的应用程序时没有出现默认选项卡?
- java - 为什么这两个代码片段没有给出相同的输出?
- c - 指向二维字符数组的指针:一步或两步的声明和初始化
- snowflake-cloud-data-platform - 如何限制重复记录插入到雪花表中
- java - 我的应用程序在我启动和启动时崩溃了?