{"id":1317,"date":"2026-03-26T12:22:55","date_gmt":"2026-03-26T15:22:55","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/"},"modified":"2026-03-26T12:22:55","modified_gmt":"2026-03-26T15:22:55","slug":"ef-core-pro-rendimiento-patrones-net-8-10","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/","title":{"rendered":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310"},"content":{"rendered":"<p>Entity Framework Core evolucion\u00f3 hasta convertirse en un ORM potente y completo que permite a los desarrolladores .NET trabajar de forma eficiente con bases de datos relacionales sin sacrificar la claridad del c\u00f3digo.<\/p>\n<p>Con EF Core 8 en adelante, nuevas funcionalidades como <strong>compiled queries<\/strong>, aggregaciones avanzadas, <strong>split queries<\/strong>, soporte para columnas JSON, <code>EF.Functions<\/code> y filtros globales hacen que sea m\u00e1s f\u00e1cil que nunca escribir c\u00f3digo de acceso a datos de alto rendimiento, expresivo y mantenible.<\/p>\n<p>En este post vamos a explorar ejemplos pr\u00e1cticos del mundo real para aprovechar al m\u00e1ximo estas herramientas, optimizar consultas, simplificar operaciones complejas y evitar errores comunes \u2014 sin perder legibilidad ni calidad de dominio.<\/p>\n<hr>\n<h2>1. Compiled Queries: Optimizaci\u00f3n en Rutas Cr\u00edticas<\/h2>\n<p>En EF Core, cada consulta LINQ se traduce a SQL cada vez que se ejecuta. Para la mayor\u00eda de las aplicaciones esto est\u00e1 bien, pero en APIs de alto tr\u00e1fico o rutas cr\u00edticas de rendimiento, esa traducci\u00f3n puede volverse un cuello de botella.<\/p>\n<p>Una <strong>compiled query<\/strong> es esencialmente una versi\u00f3n preprocesada de una consulta LINQ que EF Core guarda en memoria para no tener que traducirla a SQL cada vez que se ejecuta.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Consulta LINQ est\u00e1ndar\nvar user = await db.Users\n    .AsNoTracking()\n    .FirstOrDefaultAsync(u =&gt; u.Id == userId);\n\n<p>\/\/ Versi\u00f3n compilada<br>\nprivate static readonly Func&lt;AppDbContext, Guid, User?&gt; _getUserById =<br>\n    EF.CompileQuery(<br>\n        (AppDbContext db, Guid id) =&gt;<br>\n            db.Users<br>\n                .AsNoTracking()<br>\n                .FirstOrDefault(u =&gt; u.Id == id));<\/p>\n\n<p>\/\/ Uso<br>\nvar userCompiled = _getUserById(db, userId);<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Reduce el overhead de la traducci\u00f3n LINQ\u2192SQL en cada llamada.  <br \/>\n&#x2705; Especialmente \u00fatil en dashboards, lookups o entidades de acceso frecuente.  <br \/>\n&#x2705; Se puede combinar con <code>AsNoTracking()<\/code> para mayor rendimiento en lecturas.  <br \/>\n&#x1f4a1; No uses compiled queries en todos lados \u2014 reservalas para rutas que se ejecutan cientos o miles de veces por segundo.<\/p>\n<hr>\n<h2>2. Tracking vs No-Tracking e Identity Resolution<\/h2>\n<p>EF Core permite cargar entidades con o sin tracking. El tracking es conveniente para actualizaciones, pero tiene un costo en memoria y CPU.<\/p>\n<ul>\n<li><strong>Con tracking:<\/strong> EF Core recuerda cada entidad cargada. Si dos consultas devuelven la misma entidad (misma PK), te da la misma instancia de objeto.<\/li>\n<li><strong>Sin tracking (<code>AsNoTracking()<\/code>):<\/strong> EF Core no trackea entidades. Cada vez que consultas la misma entidad, se crea una nueva instancia, incluso si representa la misma fila de la base de datos.<\/li>\n<\/ul>\n<p>El problema con <code>AsNoTracking()<\/code> en relaciones es que pod\u00e9s terminar con objetos duplicados. La soluci\u00f3n: <code>AsNoTrackingWithIdentityResolution()<\/code>.<\/p>\n<pre><code class=\"language-csharp\">var orders = await db.Orders\n    .AsNoTrackingWithIdentityResolution()\n    .Include(o =&gt; o.Items)\n    .ThenInclude(i =&gt; i.Product)\n    .Where(o =&gt; o.OrderDate &gt;= DateTime.UtcNow.AddDays(-30))\n    .ToListAsync();\n<\/code><\/pre>\n<p>&#x2705; Sin overhead de change tracking \u2192 r\u00e1pido.  <br \/>\n&#x2705; Objetos consistentes: m\u00faltiples \u00f3rdenes con el mismo producto comparten la misma instancia.  <br \/>\n&#x1f4a1; Ideal para endpoints de lectura, reportes y dashboards.<\/p>\n<hr>\n<h2>3. Operaciones Bulk: ExecuteUpdate y ExecuteDelete<\/h2>\n<p>Las versiones anteriores de EF Core requer\u00edan cargar entidades en memoria, modificarlas y luego llamar a <code>SaveChanges()<\/code>. Para actualizaciones o eliminaciones masivas, esto es ineficiente.<\/p>\n<p>EF Core 8+ introduce <code>ExecuteUpdate<\/code> y <code>ExecuteDelete<\/code> para operar directamente en la base de datos.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Eliminar \u00f3rdenes de m\u00e1s de un a\u00f1o\nawait db.Orders\n    .Where(o =&gt; o.OrderDate &lt; DateTime.UtcNow.AddYears(-1))\n    .ExecuteDeleteAsync();\n\n<p>\/\/ Actualizar estado en bulk<br>\nawait db.Orders<br>\n    .Where(o =&gt; o.Status == \"Pending\" && o.OrderDate &lt; DateTime.UtcNow.AddDays(-7))<br>\n    .ExecuteUpdateAsync(o =&gt; o.SetProperty(order =&gt; order.Status, \"Expired\"));<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Elimina el overhead de cargar entidades en memoria.  <br \/>\n&#x2705; Reduce los round-trips a la base de datos.  <br \/>\n&#x2705; Perfecto para tareas de mantenimiento, jobs programados o background services.  <br \/>\n&#x1f4a1; Estas operaciones <strong>bypasean el change tracking<\/strong> de EF Core, tenerlo en cuenta.<\/p>\n<hr>\n<h2>4. Aggregaciones Modernas con GroupBy<\/h2>\n<p>EF Core 8+ traduce <code>Count<\/code>, <code>Sum<\/code>, <code>Min\/Max<\/code>, <code>Average<\/code> y <code>GroupBy<\/code> directamente a SQL, sin necesidad de traer datos a memoria.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Estad\u00edsticas de \u00f3rdenes por cliente\nvar customerStats = await db.Orders\n    .GroupBy(o =&gt; o.CustomerId)\n    .Select(g =&gt; new\n    {\n        CustomerId = g.Key,\n        OrdersCount = g.Count(),\n        TotalAmount = g.Sum(o =&gt; o.Total),\n        MinOrder = g.Min(o =&gt; o.Total),\n        MaxOrder = g.Max(o =&gt; o.Total),\n        AverageOrder = g.Average(o =&gt; o.Total)\n    })\n    .ToListAsync();\n<\/code><\/pre>\n<p>&#x2705; Agregaciones server-side \u2192 menos datos transferidos y menor uso de memoria.  <br \/>\n&#x2705; Ideal para dashboards, analytics o APIs de reportes.  <br \/>\n&#x1f4a1; Combinar con compiled queries si es una ruta de acceso frecuente.<\/p>\n<hr>\n<h2>5. Split Queries y Optimizaci\u00f3n de Include<\/h2>\n<p>Cuando se consultan entidades con m\u00faltiples tablas relacionadas (<code>Include<\/code>\/<code>ThenInclude<\/code>), EF Core puede generar JOINs enormes que producen filas duplicadas y ralentizan las queries \u2014 conocido como <strong>cartesian explosion<\/strong>.<\/p>\n<p>EF Core 8+ introduce <code>AsSplitQuery()<\/code> para ejecutar m\u00faltiples queries m\u00e1s peque\u00f1as en lugar de un JOIN gigante.<\/p>\n<pre><code class=\"language-csharp\">var customers = await db.Customers\n    .AsNoTracking()\n    .AsSplitQuery()\n    .Include(c =&gt; c.Orders)\n    .ThenInclude(o =&gt; o.Items)\n    .ThenInclude(i =&gt; i.Product)\n    .Include(c =&gt; c.Addresses)\n    .Where(c =&gt; c.IsActive)\n    .ToListAsync();\n<\/code><\/pre>\n<p>&#x2705; Reduce el tama\u00f1o y complejidad de las queries SQL.  <br \/>\n&#x2705; Evita cargar entidades duplicadas en memoria.  <br \/>\n&#x2705; Especialmente \u00fatil para relaciones profundamente anidadas.  <br \/>\n&#x1f4a1; Para navegaciones simples (no colecciones), un JOIN normal generalmente es suficiente.<\/p>\n<hr>\n<h2>6. Interceptors y Logging<\/h2>\n<p>EF Core permite interceptar queries, comandos y operaciones de guardado, d\u00e1ndote visibilidad profunda sobre la actividad de la base de datos. Ideal para monitoreo de rendimiento o detectar problemas de N+1.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Interceptor que loguea queries largas\npublic class QueryInterceptor : DbCommandInterceptor\n{\n    public override async Task&lt;InterceptionResult&lt;DbDataReader&gt;&gt; ReaderExecutingAsync(\n        DbCommand command,\n        CommandEventData eventData,\n        InterceptionResult&lt;DbDataReader&gt; result,\n        CancellationToken cancellationToken = default)\n    {\n        if (command.CommandText.Length &gt; 1000)\n        {\n            Console.WriteLine($\"Long query detected: {command.CommandText}\");\n        }\n        return await base.ReaderExecutingAsync(command, eventData, result, cancellationToken);\n    }\n}\n\n<p>\/\/ Query tagging para profiling<br>\nvar activeCustomers = await db.Customers<br>\n    .TagWith(\"Fetching active customers for dashboard\")<br>\n    .Where(c =&gt; c.IsActive)<br>\n    .ToListAsync();<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Identific\u00e1 queries lentas o problem\u00e1ticas en producci\u00f3n.  <br \/>\n&#x2705; Aplic\u00e1 pol\u00edticas de auditor\u00eda autom\u00e1ticamente sin cambiar la l\u00f3gica de negocio.<\/p>\n<hr>\n<h2>7. Columnas JSON y Datos Flexibles<\/h2>\n<p>EF Core 8+ permite mapear columnas JSON a propiedades, almacenando datos semi-estructurados con soporte para queries directas sobre el JSON.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Filtrar por metadata JSON\nvar redProducts = await db.Products\n    .Where(p =&gt; p.Metadata[\"Color\"].ToString() == \"Red\")\n    .ToListAsync();\n<\/code><\/pre>\n<p>&#x2705; Schema flexible sin cambiar la estructura de la base de datos.  <br \/>\n&#x2705; Queryable directamente en SQL, sin traer todo el JSON a memoria.  <br \/>\n&#x2705; Ideal para cat\u00e1logos de productos, atributos opcionales o configuraciones din\u00e1micas.<\/p>\n<hr>\n<h2>8. Raw SQL y Mapeo a DTOs<\/h2>\n<p>Cuando LINQ no alcanza para JOINs complejos o funciones espec\u00edficas de la base de datos, EF Core permite queries SQL crudas que mapean directamente a DTOs.<\/p>\n<pre><code class=\"language-csharp\">var topCustomers = await db.TopCustomers\n    .FromSqlInterpolated($@\"\n        SELECT c.Id, c.Name, SUM(o.Total) as TotalSpent\n        FROM Customers c\n        JOIN Orders o ON c.Id = o.CustomerId\n        GROUP BY c.Id, c.Name\n        HAVING SUM(o.Total) &gt; {minSpend}\n    \")\n    .ToListAsync();\n<\/code><\/pre>\n<p>&#x2705; Acced\u00e9 a funcionalidades SQL complejas no soportadas a\u00fan en LINQ.  <br \/>\n&#x2705; Mapeo directo a DTOs para APIs o reportes.  <br \/>\n&#x1f4a1; Siempre parametriz\u00e1 el SQL crudo (o us\u00e1 <code>FromSqlInterpolated<\/code>) para prevenir inyecci\u00f3n SQL.<\/p>\n<hr>\n<h2>9. EF.Functions y SQL Helpers<\/h2>\n<p>EF Core expone funciones de la base de datos directamente en LINQ, permitiendo operaciones SQL eficientes sin escribir SQL crudo.<\/p>\n<pre><code class=\"language-csharp\">\/\/ \u00d3rdenes de los \u00faltimos 30 d\u00edas\nvar recentOrders = await db.Orders\n    .Where(o =&gt; EF.Functions.DateDiffDay(o.OrderDate, DateTime.UtcNow) &lt; 30)\n    .ToListAsync();\n\n<p>\/\/ Pattern matching con LIKE<br>\nvar redProducts = await db.Products<br>\n    .Where(p =&gt; EF.Functions.Like(p.Name, \"%Red%\"))<br>\n    .ToListAsync();<\/p>\n\n<p>\/\/ B\u00fasqueda case-insensitive (PostgreSQL)<br>\nvar redProductsIgnoreCase = await db.Products<br>\n    .Where(p =&gt; EF.Functions.ILike(p.Name, \"%red%\"))<br>\n    .ToListAsync();<\/p>\n\n<p>\/\/ Tiendas cercanas (datos espaciales)<br>\nvar nearbyStores = await db.Stores<br>\n    .Where(s =&gt; EF.Functions.STDistance(s.Location, userLocation) &lt; 1000)<br>\n    .ToListAsync();<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Aprovecha funciones de la base de datos sin escribir SQL crudo.  <br \/>\n&#x2705; Sintaxis LINQ limpia que igual se ejecuta eficientemente en SQL.<\/p>\n<hr>\n<h2>10. Global Query Filters<\/h2>\n<p>Los filtros globales permiten filtrar entidades autom\u00e1ticamente a nivel del <code>DbContext<\/code>, sin tener que agregar <code>.Where()<\/code> en cada consulta. Casos de uso comunes: soft deletes, multi-tenancy o archivado.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Configurar filtro global para soft delete\nmodelBuilder.Entity&lt;User&gt;()\n    .HasQueryFilter(u =&gt; !u.IsDeleted);\n\n<p>\/\/ Uso: autom\u00e1ticamente excluye usuarios eliminados<br>\nvar activeUsers = await db.Users.ToListAsync();<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Garantiza filtrado consistente en todas las queries.  <br \/>\n&#x2705; Reduce cl\u00e1usulas <code>.Where()<\/code> repetitivas en el c\u00f3digo.  <br \/>\n&#x1f4a1; Combinalo con interceptors o campos de auditor\u00eda para apps multi-tenant.<\/p>\n<hr>\n<h2>11. Enums y Value Conversions<\/h2>\n<p>EF Core permite mapear enums u objetos de valor personalizados a columnas de la base de datos con conversiones, manteniendo un modelo de dominio expresivo.<\/p>\n<pre><code class=\"language-csharp\">\/\/ Mapear enum como string\nmodelBuilder.Entity&lt;Order&gt;()\n    .Property(o =&gt; o.Status)\n    .HasConversion&lt;string&gt;();\n\n<p>\/\/ Mapear value object personalizado<br>\nmodelBuilder.Entity&lt;User&gt;()<br>\n    .Property(u =&gt; u.Email)<br>\n    .HasConversion(<br>\n        v =&gt; v.Value,        \/\/ guardar como string<br>\n        v =&gt; new Email(v)    \/\/ recuperar como objeto Email<br>\n    );<br>\n<\/code><\/pre>\n<\/p>\n<p>&#x2705; Modelos de dominio type-safe con persistencia simple en la base de datos.  <br \/>\n&#x2705; Valores legibles en la base de datos sin sacrificar la expresividad del dominio.<\/p>\n<hr>\n<h2>12. Errores Comunes y Trampas a Evitar<\/h2>\n<p>Incluso desarrolladores experimentados pueden caer en estas trampas:<\/p>\n<ul>\n<li><strong>N+1 Queries:<\/strong> Si olvid\u00e1s el <code>Include()<\/code> para entidades relacionadas, EF Core puede lanzar una query por cada fila padre. Us\u00e1 <code>Include()<\/code> con criterio, o <code>AsSplitQuery()<\/code> para m\u00faltiples colecciones.<\/li>\n<\/ul>\n<ul>\n<li><strong>Client-Side Evaluation:<\/strong> EF Core intenta traducir LINQ a SQL, pero cuando no puede, eval\u00faa en el cliente trayendo todos los datos a memoria. Revis\u00e1 los warnings y evitalo en rutas cr\u00edticas.<\/li>\n<\/ul>\n<ul>\n<li><strong>Overhead de Tracking:<\/strong> Por defecto EF Core trackea entidades, lo que es conveniente para actualizaciones pero agrega overhead. Para operaciones de solo lectura, us\u00e1 <code>AsNoTracking()<\/code> o <code>AsNoTrackingWithIdentityResolution()<\/code>.<\/li>\n<\/ul>\n<ul>\n<li><strong>Riesgos de Raw SQL:<\/strong> Siempre parametriz\u00e1 las queries con <code>FromSqlInterpolated()<\/code> para prevenir inyecci\u00f3n SQL.<\/li>\n<\/ul>\n<ul>\n<li><strong>Cambios de versi\u00f3n:<\/strong> EF Core 8+ introduce nuevas reglas de traducci\u00f3n para aggregaciones, <code>GroupBy<\/code> y otras queries. C\u00f3digo que funcionaba en EF Core 7 puede comportarse diferente \u2014 siempre teste\u00e1 despu\u00e9s de upgrades.<\/li>\n<\/ul>\n<p>&#x1f4a1; Us\u00e1 logging, interceptors y query tagging para detectar estos problemas temprano. Ver el SQL exacto que genera tu LINQ hace que debuggear problemas de rendimiento sea mucho m\u00e1s f\u00e1cil.<\/p>\n<hr>\n<h2>Conclusi\u00f3n<\/h2>\n<p>EF Core moderno le da a los desarrolladores las herramientas para manejar desde aggregaciones complejas y relaciones profundas hasta queries cr\u00edticas de rendimiento y datos JSON semi-estructurados \u2014 manteniendo el c\u00f3digo limpio, expresivo y mantenible.<\/p>\n<p>Combinando <strong>compiled queries<\/strong>, <strong>split queries<\/strong>, <strong>EF.Functions<\/strong>, <strong>filtros globales<\/strong> y <strong>value conversions<\/strong>, pod\u00e9s construir aplicaciones robustas y de alto rendimiento que escalan con gracia y minimizan el uso de memoria.<\/p>\n<p><strong>\u00a1Happy coding!<\/strong> &#x1f680;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Domina las funcionalidades modernas de EF Core: compiled queries, split queries, columnas JSON, EF.Functions y filtros globales para escribir c\u00f3digo de acceso a datos limpio, eficiente y escalable en .NET 8\u201310.<\/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":[1],"tags":[346,359,412,39,344,411,345,65],"class_list":["post-1317","post","type-post","status-publish","format-standard","hentry","category-blog","tag-net-8","tag-asp-net-core","tag-backend","tag-c","tag-ef-core","tag-entity-framework","tag-orm","tag-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#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\/ef-core-pro-rendimiento-patrones-net-8-10\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Domina las funcionalidades modernas de EF Core: compiled queries, split queries, columnas JSON, EF.Functions y filtros globales para escribir c\u00f3digo de acceso a datos limpio, eficiente y escalable en .NET 8\u201310.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-26T15:22:55+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\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310\",\"datePublished\":\"2026-03-26T15:22:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/\"},\"wordCount\":1237,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET 8\",\"ASP.NET Core\",\"Backend\",\"c#\",\"EF Core\",\"Entity Framework\",\"ORM\",\"performance\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/\",\"name\":\"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-26T15:22:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-core-pro-rendimiento-patrones-net-8-10\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310\"}]},{\"@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":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#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\/ef-core-pro-rendimiento-patrones-net-8-10\/","og_locale":"es_ES","og_type":"article","og_title":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#183; devops Mauro Bernal","og_description":"Domina las funcionalidades modernas de EF Core: compiled queries, split queries, columnas JSON, EF.Functions y filtros globales para escribir c\u00f3digo de acceso a datos limpio, eficiente y escalable en .NET 8\u201310.","og_url":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-26T15:22:55+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310","datePublished":"2026-03-26T15:22:55+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/"},"wordCount":1237,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET 8","ASP.NET Core","Backend","c#","EF Core","Entity Framework","ORM","performance"],"articleSection":["Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/","url":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/","name":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310 &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-26T15:22:55+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-core-pro-rendimiento-patrones-net-8-10\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"EF Core como un Pro: Rendimiento, Patrones y Funcionalidades Modernas en .NET 8\u201310"}]},{"@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\/1317","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=1317"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1317\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}