首页 > 解决方案 > 如何在 .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 获得它?

任何人都有关于添加什么以正确连接的建议?

提前谢谢了。

标签: c#asp.netasp.net-coreodatawebapi

解决方案


在参考了我的一个旧 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 选项。


推荐阅读