En nuestro archivo Startup.cs en el método ConfigureServices agregamos el siguiente código para configurar OData
Startup.cspublic void ConfigureServices(IServiceCollection services){services.AddControllers(options=>{options.Filters.Add(typeof(CustomExceptionFilter));foreach (var formatter in options.OutputFormatters.OfType<ODataOutputFormatter>().Where(it => !it.SupportedMediaTypes.Any())){formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.mock-odata"));}foreach (var formatter in options.InputFormatters.OfType<ODataInputFormatter>().Where(it => !it.SupportedMediaTypes.Any())){formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.mock-odata"));}}services.AddOData();services.AddMvcCore(options =>{foreach (var outputFormatter inoptions.OutputFormatters.OfType<ODataOutputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0)){outputFormatter.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/prs.odatatestxx-odata"));}foreach (var inputFormatter in options.InputFormatters.OfType<ODataInputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0)){inputFormatter.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/prs.odatatestxx-odata"));}});}
Vamos a registrar las rutas mediante las cuales van a ser accesados nuestros servicios, nuevamente en nuestro archivo Startup ahora en el método Configure agregamos la ruta odata para todos los modelos que registremos como EDM, permitimos también que los servicios permitan filtrado, order by, seleccionar solamente unos campos
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseMvc(routeBuilder =>{routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(100).Count();routeBuilder.MapODataServiceRoute("odata", "odata", GetEdmModel());routeBuilder.EnableDependencyInjection();});}private static IEdmModel GetEdmModel(){ODataConventionModelBuilder builder = newODataConventionModelBuilder();builder.EntitySet<Cliente>("Clientes");builder.EntitySet<ClienteCategoria>("ClientesCategorias");builder.EntitySet<Caducidad>("Caducidad");return builder.GetEdmModel();}
Si corremos nuestro proyecto veremos un error en el swagger el cual corregiremos mas adelante, vamos a probar con postman los metadatos de nuestro servicio GET http://localhost:50685/odata/$metadata