如何在 .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 选项。