web-dev-qa-db-fra.com

OData sur .Net Core ne renvoie pas les bons résultats sur $ select

J'ai ajouté OData à mon projet WebAPI.

Versions:

  1. Core 3.1
  2. OData 7.3.0 (version bêta pour fonctionner avec Core 3.x)
  3. EF Core 3.1.0

Voici mon 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();

    }
}

Et le contrôleur est:

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

Les API fonctionnent bien, mais lorsque j'essaie d'ajouter une action OData comme $ select, j'obtiens les résultats suivants et non les résultats attendus:

{
    "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
},
6
Giox

Les API fonctionnent bien, mais lorsque j'essaie d'ajouter une action OData comme $ select, j'obtiens ce qui suit et non les résultats attendus

Je peux reproduire le même problème dans mon application .NET Core 3.x avec un code similaire à celui que vous avez partagé, il semble qu'actuellement, l'injection de services OData dans le contrôleur d'API existant avec l'extrait de code suivant ne prend pas bien en charge pour .NET Core 3.x.

routeBuilder.EnableDependencyInjection();

Et sur la base de mon test, cela peut bien fonctionner dans .NET Core 2.x. Faire $select la fonctionnalité fonctionne correctement dans .NET Core 3.x, actuellement nous pouvons essayer cette solution:

Dans 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());

});

Dans ODataController

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

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

        return products;
    }

    // ...

}

Résultat du test

enter image description here

Pour plus d'informations, veuillez vérifier: https://docs.Microsoft.com/en-us/odata/webapi/netcore#e-configure-the-odata-endpoint

1
Fei Han