{"id":1319,"date":"2026-03-27T12:05:36","date_gmt":"2026-03-27T15:05:36","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/"},"modified":"2026-03-27T12:05:36","modified_gmt":"2026-03-27T15:05:36","slug":"ef-functions-linq-funciones-nativas-sql-entity-framework-core","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/","title":{"rendered":"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core"},"content":{"rendered":"\n<p>Uno de los avances m\u00e1s pr\u00e1cticos en las versiones recientes de <strong>Entity Framework Core<\/strong> es la posibilidad de llamar a <strong>funciones nativas de la base de datos directamente desde LINQ<\/strong>, sin necesidad de librer\u00edas externas, interpolaci\u00f3n de SQL crudo ni workarounds costosos. Todo a trav\u00e9s de <code>EF.Functions<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El problema de antes<\/h2>\n\n\n\n<p>Antes de que EF Core expusiera estas funciones de forma nativa, llamar a algo como <code>LIKE<\/code>, <code>SOUNDEX<\/code>, <code>DATEDIFF<\/code> o <code>CONTAINS<\/code> implicaba una de estas opciones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usar <code>FromSqlRaw()<\/code> o <code>FromSqlInterpolated()<\/code>, rompiendo la fluidez del LINQ y volviendo al SQL crudo<\/li>\n<li>Instalar librer\u00edas de terceros como <strong>LinqKit<\/strong> o <strong>EntityFramework.Functions<\/strong><\/li>\n<li>Mapear funciones escalares manualmente via <code>HasDbFunction()<\/code> en el <code>OnModelCreating<\/code><\/li>\n<li>Traer m\u00e1s datos de los necesarios a memoria y filtrar en C# (el cl\u00e1sico antipatr\u00f3n de performance)<\/li>\n<\/ul>\n\n\n\n<p>Nada de eso es malo por definici\u00f3n, pero generaba fricci\u00f3n y c\u00f3digo dif\u00edcil de mantener.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es EF.Functions?<\/h2>\n\n\n\n<p><code>EF.Functions<\/code> es una propiedad est\u00e1tica de la clase <code>EF<\/code> (namespace <code>Microsoft.EntityFrameworkCore<\/code>) que expone m\u00e9todos CLR que se traducen directamente a funciones de base de datos cuando se usan en consultas LINQ to Entities. Si los llam\u00e1s fuera de ese contexto (por ejemplo en LINQ to Objects), lanzan <code>NotSupportedException<\/code> \u2014 son puros trampolines de traducci\u00f3n, no implementaciones reales en C#.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ EF.Functions es de tipo DbFunctions\n\/\/ Acced\u00e9s a sus m\u00e9todos v\u00eda EF.Functions.XYZ(...)\nvar result = context.Products\n    .Where(p => EF.Functions.Like(p.Name, \"%laptop%\"))\n    .ToList();<\/code><\/pre>\n\n\n\n<p>El SQL generado es exactamente lo que esper\u00e1s:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM Products WHERE Name LIKE '%laptop%'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones disponibles (con ejemplos)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. EF.Functions.Like \u2014 b\u00fasqueda por patr\u00f3n<\/h3>\n\n\n\n<p>La funci\u00f3n m\u00e1s usada. Equivale al operador <code>LIKE<\/code> de SQL con soporte para wildcards (<code>%<\/code>, <code>_<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Buscar productos cuyo nombre contenga \"core\"\nvar productos = await context.Productos\n    .Where(p => EF.Functions.Like(p.Nombre, \"%core%\"))\n    .ToListAsync();\n\n\/\/ Con escape character (para buscar literalmente el %)\nvar especiales = await context.Productos\n    .Where(p => EF.Functions.Like(p.Codigo, @\"50\\%\", @\"\\\"))\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<p>Antes de tener esto nativo, mucha gente hac\u00eda <code>p.Nombre.Contains(\"core\")<\/code> que en algunos providers no genera un <code>LIKE<\/code> limpio, o directamente tra\u00eda todo a memoria y filtraba en C#.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. EF.Functions.DateDiffDay \/ DateDiffMonth \/ etc. (SQL Server)<\/h3>\n\n\n\n<p>Para calcular diferencias entre fechas usando la funci\u00f3n <code>DATEDIFF<\/code> de SQL Server, sin hacer la resta en C# despu\u00e9s de traer los datos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Pedidos creados en los \u00faltimos 30 d\u00edas\nvar recientes = await context.Pedidos\n    .Where(p => EF.Functions.DateDiffDay(p.FechaCreacion, DateTime.Now) <= 30)\n    .ToListAsync();\n\n\/\/ Clientes que llevan m\u00e1s de 12 meses activos\nvar veteranos = await context.Clientes\n    .Where(c => EF.Functions.DateDiffMonth(c.FechaAlta, DateTime.Now) >= 12)\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<p>SQL generado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM Pedidos WHERE DATEDIFF(day, FechaCreacion, GETDATE()) <= 30<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. EF.Functions.Contains \u2014 Full-Text Search<\/h3>\n\n\n\n<p>Cuando ten\u00e9s un \u00edndice Full-Text configurado en SQL Server, pod\u00e9s aprovecharlo directamente desde LINQ:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Full-text search sobre la columna Descripcion\nvar resultados = await context.Articulos\n    .Where(a => EF.Functions.Contains(a.Descripcion, \"\\\"inteligencia artificial\\\"\"))\n    .ToListAsync();\n\n\/\/ B\u00fasqueda de m\u00faltiples t\u00e9rminos con NEAR\nvar proximidad = await context.Articulos\n    .Where(a => EF.Functions.Contains(a.Contenido, \"NEAR((machine, learning), 5)\"))\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<p>Sin esto, hab\u00eda que caer en <code>FromSqlRaw<\/code> o una stored procedure para aprovechar el FTS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. EF.Functions.FreeText \u2014 Full-Text Search sem\u00e1ntico<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ B\u00fasqueda por significado, no solo por texto exacto\nvar relacionados = await context.Articulos\n    .Where(a => EF.Functions.FreeText(a.Descripcion, \"programaci\u00f3n orientada a objetos\"))\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. EF.Functions.Collate \u2014 comparaci\u00f3n con collation espec\u00edfica<\/h3>\n\n\n\n<p>Muy \u00fatil para b\u00fasquedas case-sensitive o accent-sensitive sin cambiar la collation de toda la columna:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ B\u00fasqueda case-sensitive sin tocar el esquema\nvar exacto = await context.Usuarios\n    .Where(u => EF.Functions.Collate(u.Username, \"SQL_Latin1_General_CP1_CS_AS\") == \"Admin\")\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6. EF.Functions.IsNumeric (SQL Server)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Filtrar solo las filas donde un campo de texto es num\u00e9rico\nvar soloNumericos = await context.Registros\n    .Where(r => EF.Functions.IsNumeric(r.CodigoExterno) == 1)\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7. Funciones de distancia geoespacial (con provider espec\u00edfico)<\/h3>\n\n\n\n<p>Con el provider de SQL Server y NetTopologySuite, <code>EF.Functions<\/code> se extiende para soportar funciones espaciales:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Sucursales dentro de 10km del usuario\nvar cercanas = await context.Sucursales\n    .Where(s => s.Ubicacion.Distance(puntoUsuario) <= 10000)\n    .OrderBy(s => s.Ubicacion.Distance(puntoUsuario))\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones propias: HasDbFunction<\/h2>\n\n\n\n<p>Si tu base de datos tiene funciones escalares propias, pod\u00e9s exponerlas en LINQ con una declaraci\u00f3n en el modelo y sin salir de la fluidez del query:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ En el DbContext\nprotected override void OnModelCreating(ModelBuilder modelBuilder)\n{\n    modelBuilder.HasDbFunction(\n        typeof(MiDbContext).GetMethod(nameof(CalcularDescuento))!\n    );\n}\n\n\/\/ M\u00e9todo est\u00e1tico que act\u00faa de \"proxy\"\npublic static decimal CalcularDescuento(int clienteId, decimal monto)\n    => throw new NotSupportedException(); \/\/ nunca se ejecuta en C#\n\n\/\/ Uso en LINQ\nvar pedidos = await context.Pedidos\n    .Select(p => new {\n        p.Id,\n        Descuento = MiDbContext.CalcularDescuento(p.ClienteId, p.Total)\n    })\n    .ToListAsync();<\/code><\/pre>\n\n\n\n<p>EF Core traduce la llamada a <code>dbo.CalcularDescuento(ClienteId, Total)<\/code> en el SQL generado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 importa esto para la performance?<\/h2>\n\n\n\n<p>El beneficio no es solo sint\u00e1ctico. Cuando el filtrado o c\u00e1lculo ocurre <strong>en la base de datos<\/strong> en lugar de en memoria, el motor puede usar \u00edndices, paralelismo y el plan de ejecuci\u00f3n \u00f3ptimo. Traer miles de filas a C# para luego filtrarlas es uno de los problemas de performance m\u00e1s comunes en proyectos con ORM.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Enfoque<\/th><th>\u00bfFiltra en DB?<\/th><th>\u00bfUsa \u00edndices?<\/th><th>Fricci\u00f3n<\/th><\/tr><\/thead><tbody><tr><td><code>EF.Functions.Like()<\/code><\/td><td>&#x2705; S\u00ed<\/td><td>&#x2705; S\u00ed<\/td><td>M\u00ednima<\/td><\/tr><tr><td><code>p.Nombre.Contains()<\/code><\/td><td>&#x26a0;&#xfe0f; Depende del provider<\/td><td>&#x26a0;&#xfe0f; Parcial<\/td><td>Baja<\/td><\/tr><tr><td>Filtro en C# post-query<\/td><td>&#x274c; No<\/td><td>&#x274c; No<\/td><td>Alta<\/td><\/tr><tr><td><code>FromSqlRaw()<\/code><\/td><td>&#x2705; S\u00ed<\/td><td>&#x2705; S\u00ed<\/td><td>Alta (SQL manual)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p><code>EF.Functions<\/code> es una de esas features que, una vez que la conoc\u00e9s, no pod\u00e9s creer haber vivido sin ella. Reduce la necesidad de bajar a SQL crudo para casos que antes no ten\u00edan salida limpia, mantiene la expresividad del LINQ, y sobre todo <strong>empuja el trabajo al motor de base de datos donde tiene que estar<\/strong>.<\/p>\n\n\n\n<p>&#x1f4d6; Referencias oficiales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/ef\/core\/querying\/database-functions\" target=\"_blank\" rel=\"noopener\">Database Functions \u2013 EF Core | Microsoft Learn<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/microsoft.entityframeworkcore.ef.functions?view=efcore-10.0\" target=\"_blank\" rel=\"noopener\">EF.Functions Property \u2013 Microsoft Learn (EF Core 10.0)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>EF.Functions permite llamar a funciones nativas de la base de datos (LIKE, DATEDIFF, CONTAINS, Collate y m\u00e1s) directamente desde LINQ en Entity Framework Core, sin SQL crudo ni librer\u00edas externas. Ejemplos pr\u00e1cticos y comparativa de performance.<\/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":[38,412,39,418,344,411,187,345,65,37],"class_list":["post-1319","post","type-post","status-publish","format-standard","hentry","category-dotnet","tag-net","tag-backend","tag-c","tag-database","tag-ef-core","tag-entity-framework","tag-linq","tag-orm","tag-performance","tag-sql-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#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-functions-linq-funciones-nativas-sql-entity-framework-core\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"EF.Functions permite llamar a funciones nativas de la base de datos (LIKE, DATEDIFF, CONTAINS, Collate y m\u00e1s) directamente desde LINQ en Entity Framework Core, sin SQL crudo ni librer\u00edas externas. Ejemplos pr\u00e1cticos y comparativa de performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-27T15:05:36+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=\"5 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-functions-linq-funciones-nativas-sql-entity-framework-core\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core\",\"datePublished\":\"2026-03-27T15:05:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/\"},\"wordCount\":643,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET\",\"Backend\",\"c#\",\"Database\",\"EF Core\",\"Entity Framework\",\"Linq\",\"ORM\",\"performance\",\"sql server\"],\"articleSection\":[\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/\",\"name\":\"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-27T15:05:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core\"}]},{\"@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.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#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-functions-linq-funciones-nativas-sql-entity-framework-core\/","og_locale":"es_ES","og_type":"article","og_title":"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#183; devops Mauro Bernal","og_description":"EF.Functions permite llamar a funciones nativas de la base de datos (LIKE, DATEDIFF, CONTAINS, Collate y m\u00e1s) directamente desde LINQ en Entity Framework Core, sin SQL crudo ni librer\u00edas externas. Ejemplos pr\u00e1cticos y comparativa de performance.","og_url":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-27T15:05:36+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":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core","datePublished":"2026-03-27T15:05:36+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/"},"wordCount":643,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET","Backend","c#","Database","EF Core","Entity Framework","Linq","ORM","performance","sql server"],"articleSection":["DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/","url":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/","name":"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-27T15:05:36+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/ef-functions-linq-funciones-nativas-sql-entity-framework-core\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"EF.Functions: llam\u00e1 a funciones nativas de SQL desde LINQ en EF Core"}]},{"@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\/1319","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=1319"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1319\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}