.Net Core 上的 OData 在 $select 上没有 return 正确的结果

OData on .Net Core doesn't return the right results on $select

我已将 OData 添加到我的 WebAPI 项目中。

版本:

  1. 核心 3.1
  2. OData 7.3.0(测试版以便与 Core 3.x 一起使用)
  3. EF 核心 3.1.0

这是我的startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<Models.Contexts.EntityContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:MailBackup"]));
        services.AddControllers();
        services.AddMvc(options =>
        {
            options.EnableEndpointRouting = false;
        }).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);

        services.AddOData();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc(routeBuilder =>
        {
            routeBuilder.EnableDependencyInjection();
            routeBuilder.Expand().Select().OrderBy().Filter();
        });

        app.UseHttpsRedirection();
        app.UseAuthorization();

    }
}

控制器是:

[EnableQuery()]
[HttpGet]
[Route("GetAll")]
public IQueryable<Models.EmailMessage> GetAll()
{    
    return this._context.EmailMessages;
}

API 工作正常,但是当我尝试添加一些 OData 操作(如 $select 时,我得到以下结果而不是预期结果:

{
    "instance": null,
    "container": {},
    "modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
    "untypedInstance": null,
    "instanceType": null,
    "useInstanceForProperties": false
},
{
    "instance": null,
    "container": {},
    "modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
    "untypedInstance": null,
    "instanceType": null,
    "useInstanceForProperties": false
},

The APIs are working fine, but when I try to add some OData action like $select I get the following and not the expected results

我可以在我的 .NET Core 3.x 应用程序中使用与您分享的代码类似的代码重现相同的问题,目前似乎无法很好地支持使用以下代码片段将 OData 服务注入现有 API 控制器对于 .NET 核心 3.x.

routeBuilder.EnableDependencyInjection();

并且根据我的测试,它可以在 .NET Core 2.x 中正常运行。为了使 $select 功能在 .NET Core 3.x 中正常工作,目前,我们可以尝试以下解决方法:

在Startup.cs

var builder = new ODataConventionModelBuilder(app.ApplicationServices);

builder.EntitySet<Product>("Products");


app.UseMvc(routeBuilder =>
{
    // and this line to enable OData query option, for example $filter

    routeBuilder.Expand().Select().OrderBy().Filter();

    routeBuilder.MapODataServiceRoute("ODataRoute", "api", builder.GetEdmModel());

});

在 ODataController

public class ProductsController : ODataController
{
    // ...
    //code logic here
    // ...

    [HttpGet]
    [EnableQuery]
    public IQueryable<Product> Get()
    {
        var products = _context.Products;

        return products;
    }

    // ...

}

测试结果

更多信息请查看:https://docs.microsoft.com/en-us/odata/webapi/netcore#e-configure-the-odata-endpoint

我遇到了同样的问题。这为我解决了问题。也许 odata 与 Asp.Net 3.1 中新的 JSON 序列化程序不完全兼容。我不知道。

services.AddControllers(mvcOptions =>
           mvcOptions.EnableEndpointRouting = false)
       .AddNewtonsoftJson();