{"id":1251,"date":"2020-07-28T08:52:32","date_gmt":"2020-07-28T08:52:32","guid":{"rendered":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=1251"},"modified":"2020-07-28T08:59:05","modified_gmt":"2020-07-28T08:59:05","slug":"como-utilizar-tus-modelos-con-odata-en-asp-net-core","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/","title":{"rendered":"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1257\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg\" alt=\"\" width=\"1080\" height=\"721\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg 1080w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata-300x200.jpg 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata-1024x684.jpg 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata-768x513.jpg 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata-610x407.jpg 610w\" sizes=\"auto, (max-width: 1080px) 100vw, 1080px\" \/><\/p>\n<p>Continuamos con la serie de posts relacionados con Asp.Net Core y OData. El gran Adri\u00e1n D\u00edaz hace poco escribi\u00f3 el siguiente art\u00edculo sobre <a href=\"https:\/\/www.theavenger.dev\/posts\/odata-dotnet-entityframework\/\" target=\"_blank\" rel=\"noopener noreferrer\">C\u00f3mo beneficiar nuestro perfomance con Entity Framework.<\/a><\/p>\n<p><!--more--><\/p>\n<p>Uno de los problemas que veo cuando empleamos OData es que exponemos en el controlador las entidades de nuestra base de datos&#8230;\u00bfqu\u00e9 os parecer\u00eda si os dijera que podemos definir nuestros modelos y poder filtrar con los mismos en nuestras consultas OData? Suena bien, \u00bfverdad? Vamos al l\u00edo \ud83d\ude42<\/p>\n<h1>Diferencia entre modelo y entidad<\/h1>\n<p>Lo primero que vamos a ver es la diferencia que veo entre un modelo o DTO y un entidad de base de datos.<\/p>\n<ul>\n<li><strong>Entidad<\/strong>: La entidad representa un concepto del mundo real, la cual posee atributos y se relaciona con otras entidades. Suele tener persistencia en base de datos.<\/li>\n<li><strong>Modelo<\/strong>: El modelo es una proyecci\u00f3n de una entidad pero que se ajusta a un problema o un espacio de nuestro dominio concreto, por lo que el n\u00famero de atributos con respecto a la entidad puede variar y puede contener m\u00e9todos que conforman un comportamiento.<\/li>\n<\/ul>\n<p>En nuestro ejemplo vamos a definir una entidad en nuestra base de datos,\u00a0 dicha entidad la llamaremos <strong>Tarea<\/strong>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\nnamespace AspNetCoreODataWithModel.Shared.Models.Database\r\n{\r\n    public abstract class BaseEntity\r\n    {\r\n        public int Id { get; set; }\r\n    }\r\n}\r\n\r\n\r\nusing AspNetCoreODataWithModel.Shared.Models.Database;\r\nusing System;\r\n\r\nnamespace AspNetCoreODataWithModel.Data.Entities\r\n{\r\n    public class Tarea : BaseEntity\r\n    {\r\n        public string Nombre { get; set; }\r\n        public string Observaciones { get; set; }\r\n        public DateTime? Fecha{ get; set; }\r\n        public bool Facturable { get; set; }\r\n    }\r\n}\r\n<\/pre>\n<p>Definiremos nuestro modelo que ser\u00e1 el que expongamos en nuestra Api y lo llamaramos <strong>TaskModel<\/strong>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\nusing System;\r\n\r\nnamespace AspNetCoreODataWithModel.Model\r\n{\r\n    public class TaskModel\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string Observations { get; set; }\r\n        public DateTime? Date { get; set; }\r\n        public bool Billable { get; set; }\r\n    }\r\n}\r\n<\/pre>\n<p>Bien, ya tenemos nuestra entidad y nuestro modelo definidos. Como v\u00e9is, el modelo posee atributos o propiedades con nombres en ingl\u00e9s y la entidad en espa\u00f1ol. As\u00ed reflejaremos mejor el comportamiento del filtrado OData usando propiedades en ingl\u00e9s \ud83d\ude42<\/p>\n<h1>Implementando la magia<\/h1>\n<p>Os explicar\u00e9 el truco&#8230; al final lo que hay que hacer es generar un nuevo filtro OData a partir del filtro OData de entrada con nuestro modelo, haciendo un mapeo de las propiedades.<\/p>\n<p>Para ello pondr\u00e9 el c\u00f3digo y lo analizaremos juntos, \u00bfok?<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\n \r\n&#x5B;HttpGet(&quot;&quot;)]\r\n&#x5B;ProducesResponseType(typeof(IEnumerable&lt;TaskModel&gt;), StatusCodes.Status200OK)]\r\n&#x5B;ProducesResponseType(typeof(BadRequestObjectResult), StatusCodes.Status400BadRequest)]\r\n&#x5B;ProducesResponseType(typeof(NotFoundObjectResult), StatusCodes.Status404NotFound)]\r\n&#x5B;ProducesResponseType(StatusCodes.Status500InternalServerError)]\r\n&#x5B;EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] \r\npublic IActionResult Get(ODataQueryOptions&lt;TaskModel&gt; filter)\r\n{\r\n\tvar tasks = repository.ListAll();\r\n\tif (!string.IsNullOrWhiteSpace(filter.Filter?.RawValue))\r\n\t{\r\n\t\tIEdmModel model = EdmModelHelper.GetEdmModel();\r\n\t\tIEdmType type = model.FindDeclaredType(&quot;AspNetCoreODataWithModel.Data.Entities.Tarea&quot;);\r\n\t\tIEdmNavigationSource source = model.FindDeclaredEntitySet(&quot;Tareas&quot;);\r\n\t\tODataQueryOptionParser parser = new ODataQueryOptionParser(model, type, source, new Dictionary&lt;string, string&gt; { { &quot;$filter&quot;, filter.Filter?.RawValue } });\r\n\t\tODataQueryContext context = new ODataQueryContext(model, typeof(Tarea), filter.Context.Path);\r\n\t\tFilterQueryOption newfilter = new FilterQueryOption(filter.Filter?.RawValue, context, parser);\r\n\r\n\t\ttasks = newfilter.ApplyTo(tasks, new ODataQuerySettings()) as IQueryable&lt;Tarea&gt;;\r\n\t}\r\n\r\n\tvar results = tasks.Select(p =&gt; mapper.Map&lt;TaskMode&gt;(p));\r\n\tvar page = new PageResult&lt;TaskModel&gt;(mapper.Map&lt;IEnumerable&amp;&lt;TaskModel&gt;&gt;(results.ToList()),\r\n\t\tRequest.HttpContext.ODataFeature().NextLink,\r\n\t\tRequest.HttpContext.ODataFeature().TotalCount);\r\n\r\n\treturn Ok(page);\r\n}\r\n\r\n...........................\r\n\r\npublic static IEdmModel GetEdmModel()\r\n{\r\n\tODataModelBuilder builder = new ODataConventionModelBuilder().EnableLowerCamelCase(NameResolverOptions.ProcessReflectedPropertyNames | NameResolverOptions.ProcessExplicitPropertyNames);\r\n\treturn GetEdmModel(builder);\r\n}\r\n\r\nprivate static IEdmModel GetEdmModel(ODataModelBuilder builder)\r\n{\r\n\tEntitySetConfiguration&lt;Tarea&gt; tasks = builder.EntitySet&lt;Tarea&gt;(&quot;Tareas&quot;);\r\n\tbuilder.ContainerName = &quot;DefaultContainer&quot;;\r\n\ttasks.EntityType.Name = &quot;Tarea&quot;;\r\n\ttasks.EntityType.Namespace = &quot;AspNetCoreODataWithModel.Data.Entities&quot;;\r\n\r\n\ttasks.EntityType.Property(p =&gt; p.Id).Name = &quot;Id&quot;;\r\n\ttasks.EntityType.Property(p =&gt; p.Nombre).Name = &quot;Name&quot;;\r\n\ttasks.EntityType.Property(p =&gt; p.Fecha).Name = &quot;Date&quot;;\r\n\ttasks.EntityType.Property(p =&gt; p.Facturable).Name = &quot;Billable&quot;;\r\n\ttasks.EntityType.Property(p =&gt; p.Observaciones).Name = &quot;Observations&quot;;\r\n\r\n\ttasks.EntityType\r\n\t\t\t\t\t.Filter()\r\n\t\t\t\t\t.Count()\r\n\t\t\t\t\t.Expand()\r\n\t\t\t\t\t.OrderBy()\r\n\t\t\t\t\t.Page()\r\n\t\t\t\t\t.Select();\r\n\r\n\treturn builder.GetEdmModel();\r\n}\r\n<\/pre>\n<p>En el c\u00f3digo del controlador lo primero que observamos es que llamamos al repositorio al m\u00e9todo <strong>ListAll()<\/strong> que lo \u00fanico que hace es devolver un <strong>IQueryable<\/strong>.<\/p>\n<p>Luego con el m\u00e9todo <strong>EdmModelHelper.GetEdmModel();<\/strong> lo que hacemos es establecer el modelo <strong>Edm<\/strong> que usa OData para la entidad <strong>Tarea<\/strong>, realizando un \u00abmapeo\u00bb (estableciendo en su propiedad Name el nombre de la propiedad de nuestro modelo). Esto es muy importante para poder crear el nuevo filtro OData.<\/p>\n<p>El siguiente bloque lo que hace es que, si se recibe un filtro OData desde el modelo de entrada, generamos un nuevo filtro con la entidad y aplicamos sobre el <strong>IQueryable<\/strong> inicial los filtros correctos.<\/p>\n<p>Mola mucho, \u00bfeh?<\/p>\n<h1>OData y Swagger<\/h1>\n<p>Como regalito de cumplea\u00f1os (hoy 28 de julio es el m\u00edo jejejeje) os voy a proporcionar una clase para definir los par\u00e1metros OData y lo pod\u00e1is usar con <strong>Swashbuckle<\/strong> y <strong>Swagger<\/strong>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\nusing Microsoft.AspNet.OData;\r\nusing Microsoft.AspNet.OData.Query;\r\nusing Microsoft.OpenApi.Models;\r\nusing Swashbuckle.AspNetCore.SwaggerGen;\r\nusing System.Linq;\r\n\r\nnamespace AspNetCoreODataWithModel.Infrastructure.Swagger\r\n{\r\n    public class ODataQueryOptionsFilter : IOperationFilter\r\n    {\r\n        public void Apply(OpenApiOperation operation, OperationFilterContext context)\r\n        {\r\n            var queryAttribute = context.MethodInfo.GetCustomAttributes(true)\r\n                .Union(context.MethodInfo.DeclaringType.GetCustomAttributes(true))\r\n                .OfType&lt;EnableQueryAttribute&gt;().FirstOrDefault();\r\n\r\n            if (queryAttribute != null)\r\n            {\r\n                operation.Parameters?.RemoveAt(0);\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Select))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$select&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;Selects which properties to include in the response.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Expand))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$expand&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;Expands related entities inline.&quot;,                                              \r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                \/\/ Additional OData query options are available for collections of entities only\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Filter))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$filter&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;Filters the results, based on a Boolean condition.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.OrderBy))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$orderby&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;Determines what values are used to order a collection of results.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Top))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$top&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;The max number of results.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Skip))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$skip&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;The number of results to skip.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n\r\n                if (queryAttribute.AllowedQueryOptions.HasFlag(AllowedQueryOptions.Count))\r\n                {\r\n                    operation.Parameters.Add(new OpenApiParameter\r\n                    {\r\n                        Name = &quot;$count&quot;,\r\n                        In = ParameterLocation.Query,\r\n                        Description = &quot;Returns count of results.&quot;,\r\n                        Schema = new OpenApiSchema { Type = &quot;string&quot; }\r\n                    });\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.......\r\n\r\npublic static IServiceCollection AddSwagger(this IServiceCollection services)\r\n{\r\n\tservices.AddSwaggerGen(options =&gt;\r\n\t{\r\n\t\toptions.SwaggerDoc(ApiConstants.Swagger.ApiVersion, new OpenApiInfo\r\n\t\t{\r\n\t\t\tVersion = ApiConstants.Swagger.ApiVersion,\r\n\t\t\tTitle = ApiConstants.Swagger.ApiName,\r\n\t\t\tDescription = ApiConstants.Swagger.ApiName\r\n\t\t});\r\n\t\toptions.EnableAnnotations();\r\n\t\toptions.IgnoreObsoleteProperties();\r\n\t\toptions.IgnoreObsoleteActions();\r\n\t\toptions.DescribeAllParametersInCamelCase();\r\n\t\toptions.EnableAnnotations();\r\n\t\toptions.OperationFilter&lt;ODataQueryOptionsFilter&gt;();   \/\/ Aqu\u00ed nuestro filtro OData\r\n\t   \r\n\t\t\/\/ Set the comments path for the Swagger JSON and UI.\r\n\t\tvar xmlFile = $&quot;{Assembly.GetExecutingAssembly().GetName().Name}.xml&quot;;\r\n\t\tvar xmlPath = Path.Combine(System.AppContext.BaseDirectory, xmlFile);\r\n\t\toptions.IncludeXmlComments(xmlPath);\r\n\t});\r\n\r\n\tservices.AddSwaggerGen();\r\n\r\n\treturn services;\r\n}\r\n<\/pre>\n<p>Para que ve\u00e1is c\u00f3mo queda en Swagger<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1252\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger-300x262.png\" alt=\"\" width=\"300\" height=\"262\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger-300x262.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger-768x670.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger-610x532.png 610w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/ODataSwagger.png 967w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h1>Probando el desarrollo<\/h1>\n<p>Realizaremos una consulta sencilla para probar que todo funciona de lujo. Establecermos un filtro en nuestro <strong>Swagger<\/strong>,\u00a0 como por ejemplo en el campo<br \/>\n<strong>$filter<\/strong> ponemos <strong>billable eq true<\/strong><\/p>\n<p>y obtenemos la siguiente salida:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\n  {\r\n    &quot;id&quot;: 1,\r\n    &quot;name&quot;: &quot;Tarea 1&quot;,\r\n    &quot;observations&quot;: &quot;Sin observaciones&quot;,\r\n    &quot;date&quot;: &quot;2020-07-25T10:11:27.7125366+02:00&quot;,\r\n    &quot;billable&quot;: true\r\n  },\r\n  {\r\n    &quot;id&quot;: 3,\r\n    &quot;name&quot;: &quot;Tarea 3&quot;,\r\n    &quot;observations&quot;: &quot;Esto es una prueba de observaciones&quot;,\r\n    &quot;date&quot;: &quot;2020-07-21T10:11:27.7127657+02:00&quot;,\r\n    &quot;billable&quot;: true\r\n  }\r\n]\r\n<\/pre>\n<p>Si establecemos el campo <strong>$filter<\/strong> a <strong>billable eq false<\/strong><\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\n  {\r\n    &quot;id&quot;: 2,\r\n    &quot;name&quot;: &quot;Tarea 2&quot;,\r\n    &quot;observations&quot;: &quot;Sin observaciones&quot;,\r\n    &quot;date&quot;: &quot;2020-07-28T10:11:27.7127637+02:00&quot;,\r\n    &quot;billable&quot;: false\r\n  }\r\n]\r\n<\/pre>\n<p>\u00bfQuieres s\u00f3lo devolver el identificador y el nombre de las tareas?<\/p>\n<p>En el campo <strong>$select<\/strong> estableceremos\u00a0 \u00a0<strong>id, name<\/strong><\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\"> \r\n  {\r\n    &quot;id&quot;: 1,\r\n    &quot;name&quot;: &quot;Tarea 1&quot;\r\n  },\r\n  {\r\n    &quot;id&quot;: 2,\r\n    &quot;name&quot;: &quot;Tarea 2&quot;\r\n  },\r\n  {\r\n    &quot;id&quot;: 3,\r\n    &quot;name&quot;: &quot;Tarea 3&quot;\r\n  }\r\n]\r\n<\/pre>\n<h1><strong>Conclusiones<\/strong><\/h1>\n<p>Hemos visto c\u00f3mo usar nuestros modelos en los controladores y poder realizar los filtros OData sobre entidades de base de datos sin exponerlas al exterior.<\/p>\n<p>El c\u00f3digo pod\u00e9is descargarlo en Github\u00a0https:\/\/github.com\/Encamina\/Blogs\/tree\/master\/Desarrolla%20en%20colores\/AspNetCoreODataWithModel<\/p>\n<p>Happy coding!!!!<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Continuamos con la serie de posts relacionados con Asp.Net Core y OData. El gran Adri\u00e1n D\u00edaz hace poco escribi\u00f3 el siguiente art\u00edculo sobre C\u00f3mo beneficiar nuestro perfomance con Entity Framework.<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":185,"featured_media":1257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70,32],"tags":[],"class_list":["post-1251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-azure-app-services"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>C\u00f3mo utilizar tus modelos con OData en Asp.Net Core | ENCAMINA<\/title>\n<meta name=\"description\" content=\"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core\" \/>\n<meta property=\"og:description\" content=\"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-28T08:52:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-07-28T08:59:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1080\" \/>\n\t<meta property=\"og:image:height\" content=\"721\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sergio Parra Guerra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sergio Parra Guerra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#article\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/\"},\"author\":{\"name\":\"Sergio Parra Guerra\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\"},\"headline\":\"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core\",\"datePublished\":\"2020-07-28T08:52:32+00:00\",\"dateModified\":\"2020-07-28T08:59:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/\"},\"wordCount\":1494,\"commentCount\":0,\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2020\\\/07\\\/Odata.jpg\",\"articleSection\":[\".NET\",\"Azure App Services\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/\",\"url\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/\",\"name\":\"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core | ENCAMINA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2020\\\/07\\\/Odata.jpg\",\"datePublished\":\"2020-07-28T08:52:32+00:00\",\"dateModified\":\"2020-07-28T08:59:05+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\"},\"description\":\"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2020\\\/07\\\/Odata.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2020\\\/07\\\/Odata.jpg\",\"width\":1080,\"height\":721},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\",\"name\":\"Sergio Parra Guerra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"caption\":\"Sergio Parra Guerra\"},\"description\":\"Sergio Parra es Ingeniero T\u00e9cnico en Inform\u00e1tica de Sistemas por la UPSAM. Tiene a sus espaldas much\u00edsimas certificaciones entre las cuales Microsoft Certified Professional y ex Microsoft MVP Visual Studio and Development Technologies. Actualmente es un magn\u00edfico Software &amp; Cloud Architect en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/sparra\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core | ENCAMINA","description":"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core","og_description":"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.","og_url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2020-07-28T08:52:32+00:00","article_modified_time":"2020-07-28T08:59:05+00:00","og_image":[{"width":1080,"height":721,"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg","type":"image\/jpeg"}],"author":"Sergio Parra Guerra","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Sergio Parra Guerra","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#article","isPartOf":{"@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/"},"author":{"name":"Sergio Parra Guerra","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b"},"headline":"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core","datePublished":"2020-07-28T08:52:32+00:00","dateModified":"2020-07-28T08:59:05+00:00","mainEntityOfPage":{"@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/"},"wordCount":1494,"commentCount":0,"image":{"@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg","articleSection":[".NET","Azure App Services"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/","url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/","name":"C\u00f3mo utilizar tus modelos con OData en Asp.Net Core | ENCAMINA","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#primaryimage"},"image":{"@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg","datePublished":"2020-07-28T08:52:32+00:00","dateModified":"2020-07-28T08:59:05+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b"},"description":"Continuamos con la serie de posts relacionados con Asp.Net Core y OData.","inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/como-utilizar-tus-modelos-con-odata-en-asp-net-core\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2020\/07\/Odata.jpg","width":1080,"height":721},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b","name":"Sergio Parra Guerra","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","caption":"Sergio Parra Guerra"},"description":"Sergio Parra es Ingeniero T\u00e9cnico en Inform\u00e1tica de Sistemas por la UPSAM. Tiene a sus espaldas much\u00edsimas certificaciones entre las cuales Microsoft Certified Professional y ex Microsoft MVP Visual Studio and Development Technologies. Actualmente es un magn\u00edfico Software &amp; Cloud Architect en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/sparra\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/185"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=1251"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1251\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media\/1257"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=1251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=1251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=1251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}