{"id":1260,"date":"2026-03-12T08:57:51","date_gmt":"2026-03-12T11:57:51","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1260"},"modified":"2026-03-12T08:57:51","modified_gmt":"2026-03-12T11:57:51","slug":"linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/","title":{"rendered":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos"},"content":{"rendered":"\n<p class=\"intro-destacado\">LINQ es una de las features de C# que m\u00e1s uso cada d\u00eda. Y con .NET 9 y .NET 10 recibi\u00f3 adiciones concretas que resuelven patrones que antes requer\u00edan GroupBy + Select + ToDictionary en cadena. CountBy, AggregateBy e Index son peque\u00f1os pero cambian bastante el c\u00f3digo de consulta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Index(): el iterador con \u00edndice que deber\u00eda haber existido siempre<\/h2>\n\n\n\n<p>Cu\u00e1ntas veces escribiste <code>.Select((item, i) => (i, item))<\/code> solo para tener el \u00edndice en un foreach? <code>Index()<\/code> hace exactamente eso con una API limpia.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code\">var productos = new[] { \"Monitor\", \"Teclado\", \"Mouse\", \"Auriculares\" };\n\n\/\/ &#x274c; Antes: Select con tupla o variable externa\nint i = 0;\nforeach (var p in productos)\n    Console.WriteLine($\"{i++}. {p}\");\n\n\/\/ O la versi\u00f3n LINQ verbose:\nforeach (var (indice, producto) in productos.Select((p, i) => (i, p)))\n    Console.WriteLine($\"{indice}. {producto}\");\n\n\/\/ &#x2705; .NET 9: Index() \u2014 limpio y declarativo\nforeach (var (indice, producto) in productos.Index())\n    Console.WriteLine($\"{indice}. {producto}\");\n\n\/\/ Tambi\u00e9n \u00fatil en proyecciones\nvar conIndice = productos.Index()\n    .Where(x => x.Index % 2 == 0)   \/\/ solo los pares\n    .Select(x => $\"[{x.Index}] {x.Item}\");\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">CountBy(): contar por clave sin GroupBy<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code\">var pedidos = new[]\n{\n    new { Cliente = \"Ana\",   Estado = \"Pagado\",    Monto = 100m },\n    new { Cliente = \"Juan\",  Estado = \"Pendiente\", Monto = 200m },\n    new { Cliente = \"Ana\",   Estado = \"Pagado\",    Monto = 150m },\n    new { Cliente = \"Pedro\", Estado = \"Pendiente\", Monto = 300m },\n    new { Cliente = \"Juan\",  Estado = \"Cancelado\", Monto = 50m  },\n};\n\n\/\/ &#x274c; Antes: GroupBy + Count \u2014 verboso\nvar conteoAntes = pedidos\n    .GroupBy(p => p.Cliente)\n    .Select(g => new { Cliente = g.Key, Cantidad = g.Count() })\n    .ToDictionary(x => x.Cliente, x => x.Cantidad);\n\n\/\/ &#x2705; .NET 9: CountBy \u2014 directo al punto\nvar conteoPorCliente = pedidos.CountBy(p => p.Cliente);\n\/\/ { \"Ana\": 2, \"Juan\": 2, \"Pedro\": 1 }\n\n\/\/ CountBy devuelve IEnumerable&lt;KeyValuePair&lt;TKey, int&gt;&gt;\nforeach (var (cliente, cantidad) in conteoPorCliente)\n    Console.WriteLine($\"{cliente}: {cantidad} pedidos\");\n\n\/\/ Contar por m\u00faltiples criterios con tipo an\u00f3nimo\nvar conteoPorEstado = pedidos.CountBy(p => p.Estado);\n\/\/ { \"Pagado\": 2, \"Pendiente\": 2, \"Cancelado\": 1 }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">AggregateBy(): acumulaci\u00f3n agrupada sin GroupBy<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code\">\/\/ &#x274c; Antes: GroupBy + Sum \u2014 varios pasos\nvar totalesAntes = pedidos\n    .GroupBy(p => p.Cliente)\n    .ToDictionary(g => g.Key, g => g.Sum(p => p.Monto));\n\n\/\/ &#x2705; .NET 9: AggregateBy \u2014 acumulaci\u00f3n directa\nvar totalPorCliente = pedidos.AggregateBy(\n    keySelector: p => p.Cliente,\n    seed: 0m,\n    func: (acumulado, pedido) => acumulado + pedido.Monto\n);\n\/\/ { \"Ana\": 250, \"Juan\": 250, \"Pedro\": 300 }\n\n\/\/ Caso m\u00e1s complejo: acumular un objeto personalizado\nvar resumenPorCliente = pedidos.AggregateBy(\n    keySelector: p => p.Cliente,\n    seed: (Cantidad: 0, Total: 0m, UltimoPedido: \"\"),\n    func: (acc, p) => (\n        Cantidad: acc.Cantidad + 1,\n        Total: acc.Total + p.Monto,\n        UltimoPedido: p.Estado\n    )\n);\n\nforeach (var (cliente, resumen) in resumenPorCliente)\n    Console.WriteLine($\"{cliente}: {resumen.Cantidad} pedidos, ${resumen.Total} total\");<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mejoras de rendimiento en LINQ (.NET 9 y .NET 10)<\/h2>\n\n\n\n<p>M\u00e1s all\u00e1 de las nuevas APIs, .NET 9 y .NET 10 mejoran el rendimiento interno de operaciones LINQ existentes. Algunas que not\u00e9 en benchmarks reales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Order() \/ OrderDescending():<\/strong> versiones sin selector \u2014 m\u00e1s r\u00e1pidas que <code>OrderBy(x => x)<\/code><\/li>\n<li><strong>GroupBy con span:<\/strong> reducci\u00f3n de allocations en agrupaciones de tipos por valor<\/li>\n<li><strong>Where + Select fusionados:<\/strong> el JIT puede combinar estas operaciones en algunos casos<\/li>\n<li><strong>ToFrozenDictionary() \/ ToFrozenSet():<\/strong> colecciones inmutables optimizadas para lectura frecuente<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code\">\/\/ ToFrozenDictionary: para lookups frecuentes de datos que no cambian\n\/\/ M\u00e1s r\u00e1pido que Dictionary en lecturas; m\u00e1s lento en construcci\u00f3n\nusing System.Collections.Frozen;\n\nvar codigosPais = new Dictionary&lt;string, string&gt;\n{\n    { \"AR\", \"Argentina\" }, { \"BR\", \"Brasil\" }, { \"CL\", \"Chile\" }\n};\n\n\/\/ Convertir a FrozenDictionary \u2014 operaci\u00f3n costosa una sola vez\nFrozenDictionary&lt;string, string&gt; lookup = codigosPais.ToFrozenDictionary();\n\n\/\/ Lookups subsiguientes son m\u00e1s r\u00e1pidos que Dictionary est\u00e1ndar\nstring pais = lookup[\"AR\"];  \/\/ Acceso optimizado<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mi cheat sheet de LINQ moderno<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Necesidad<\/th><th>Antes<\/th><th>Ahora (.NET 9+)<\/th><\/tr><\/thead><tbody>\n<tr><td>Iterar con \u00edndice<\/td><td><code>.Select((x,i)=>(i,x))<\/code><\/td><td><code>.Index()<\/code><\/td><\/tr>\n<tr><td>Contar por clave<\/td><td><code>.GroupBy(k).Select(count)<\/code><\/td><td><code>.CountBy(k)<\/code><\/td><\/tr>\n<tr><td>Acumular por clave<\/td><td><code>.GroupBy(k).ToDictionary(sum)<\/code><\/td><td><code>.AggregateBy(k, seed, func)<\/code><\/td><\/tr>\n<tr><td>Ordenar elementos<\/td><td><code>.OrderBy(x => x)<\/code><\/td><td><code>.Order()<\/code><\/td><\/tr>\n<tr><td>Lookup inmutable<\/td><td><code>new Dictionary&lt;&gt;()<\/code><\/td><td><code>.ToFrozenDictionary()<\/code><\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n<hr class=\"wp-block-separator\"\/>\n<p><em><a href=\"https:\/\/maurobernal.com.ar\/blog\/?p=1259\">\u2190 Extension Members en C# 14\/15: propiedades y miembros est\u00e1ticos de extensi\u00f3n como nunca antes<\/a> | <strong>Serie .NET 8 \u2192 .NET 10<\/strong> | Pr\u00f3ximo: <a href=\"https:\/\/maurobernal.com.ar\/blog\/?p=1261\">Rendimiento extremo en .NET 10: Stack allocation, Native AOT y el GC que trabaja menos \u2192<\/a><\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>LINQ en .NET 9 y .NET 10: CountBy, AggregateBy e Index resuelven patrones que antes requer\u00edan GroupBy encadenado. M\u00e1s FrozenDictionary y mejoras de rendimiento internas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[202],"tags":[299,211,18,294,295,187,65],"class_list":["post-1260","post","type-post","status-publish","format-standard","hentry","category-dotnet","tag-collections","tag-csharp","tag-dotnet","tag-dotnet10","tag-dotnet9","tag-linq","tag-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy e Index resuelven patrones que antes requer\u00edan GroupBy encadenado. M\u00e1s FrozenDictionary y mejoras de rendimiento internas.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-12T11:57:51+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos\",\"datePublished\":\"2026-03-12T11:57:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/\"},\"wordCount\":242,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"collections\",\"csharp\",\"dotnet\",\"dotnet10\",\"dotnet9\",\"Linq\",\"performance\"],\"articleSection\":[\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/\",\"name\":\"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-12T11:57:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal","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":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/","og_locale":"es_ES","og_type":"article","og_title":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal","og_description":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy e Index resuelven patrones que antes requer\u00edan GroupBy encadenado. M\u00e1s FrozenDictionary y mejoras de rendimiento internas.","og_url":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-12T11:57:51+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos","datePublished":"2026-03-12T11:57:51+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/"},"wordCount":242,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["collections","csharp","dotnet","dotnet10","dotnet9","Linq","performance"],"articleSection":["DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/","url":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/","name":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-12T11:57:51+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/linq-dotnet9-dotnet10-countby-aggregateby-index-mejoras\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"LINQ en .NET 9 y .NET 10: CountBy, AggregateBy, Index() y las mejoras que cambian c\u00f3mo consult\u00e1s datos"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1260"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1260\/revisions"}],"predecessor-version":[{"id":1269,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1260\/revisions\/1269"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}