如何在 .NET Core 5.0 WebAPI 解决方案中启用完整的 OData 功能?
How do I enable full OData functionality in .NET Core 5.0 WebAPI solution?
我无法让 OData 在新的 .NET Core WebAPI 解决方案 (.NET 5.0) 中工作。
我正在通过标准“/api/entity”获取数据并使用自定义过滤器,但我更喜欢使用 OData 内置 $select、$filter、$count 、$元数据等特征。
我已经为 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>
(并确保 return 集合 AsQueryable()
。
成功了,现在我看到了这个集合所需的所有 OData 选项。
我无法让 OData 在新的 .NET Core WebAPI 解决方案 (.NET 5.0) 中工作。
我正在通过标准“/api/entity”获取数据并使用自定义过滤器,但我更喜欢使用 OData 内置 $select、$filter、$count 、$元数据等特征。
我已经为 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>
(并确保 return 集合 AsQueryable()
。
成功了,现在我看到了这个集合所需的所有 OData 选项。