J'ai ajouté OData à mon projet WebAPI.
Versions:
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
},
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
Pour plus d'informations, veuillez vérifier: https://docs.Microsoft.com/en-us/odata/webapi/netcore#e-configure-the-odata-endpoint