La .NET CONF 2024 acaba de terminar. Descubre las NOVEDADES de .NET 9 junto a los CAMBIOS que trae C# 13.
Puedes ver el contenido de este vídeo junto con su curso en el modo vídeo (similar a Udemy) si pulsas aquí.

SQL Puro en Entity Framework core

Bienvenidos a todos a un nuevo post sobre el curso de Entity framework Core. Inicialmente este post iba a ser parte de otro, pero, después de consultarlo con la comunidad, parece que tiene sentido que tenga su propio post.

En este post, vamos a ver cómo ejecutar Raw SQL desde Entity framework Core. 

1 - ¿Por qué SQL Puro?

Lo primero que tenemos que entender es por qué vamos a querer escribir consultas SQL dentro de nuestro código. El motivo principal es por las limitaciones y problemas que las consultas generadas por SQL de forma automática nos generan.

 

Estos problemas suelen estar relacionados en la gran mayoría de los casos con el rendimiento y aunque sí es cierto, que desde .NET 7 Entity framework Core ha mejorado mucho a la hora de construir las consultas, cuando estas son algo más complejas, sigue teniendo problemas. 

 

El problema de la limitación que he mencionado es cuando por ejemplo tu base de datos tiene alguna característica concreta que entity framework no la tiene, siempre puedes correr un SQL puro de forma directa.

 

 

2 - Utilizar SQL Puro desde entity framework Core

Como siempre, este código está disponible en GitHub.

 

La forma más sencilla de ver el funcionamiento es a través del ejemplo. 

Una cosa a tener en cuenta es que la gran mayoría de veces que vas a utilizar SQL desde Entity Framework va a ser para realizar consultas. Es posible realizar modificaciones, inserciones o borrados?  SI, pero no es lo común ya que por norma general, EF funciona muy bien en ese aspecto. 



Para simplificar el ejemplo, vamos a coger una consulta normal que ya tenemos en nuestro sistema que es leer un registro por ID.

[HttpGet("raw-sql/{userId}")]
public async Task<User?> RawSql(int userId)
{
    return await _context.Users
        .FromSqlInterpolated($"Select * from Users where id = {userId}")
        .FirstAsync();
}

 

En este caso estamos utilizando el context y de ahí accedemos al DbSet, y cada DbSet tiene la capacidad de ejecutar uno de los siguientes métodos FromSql (obsoleto desde .net core 3)  FromSqlRaw y finalmente FromSqlInterpolated, que es donde ponemos la consulta SQL.

 

La diferencia entre FromSqlRaw y FromSqlInterplated es que en el primero debemos construir la query, y luego pasar los parámetros, mientras que en el segundo, podemos poner los parámetros de forma interpolada. 

 

Puedes pensar que este mecanismo no es del todo seguro, pero la verdad es que el uso de FromSqlInterpolated parametriza los valores de entrada de forma automática, lo que ayuda contra la inyección SQL. 



Como nota adicional, mencionar que, desde el Context podemos acceder a _context.Database.SqlQueryRaw<T>(“select * from …”), pero personalmente prefiero acceder desde el DbSet para la gran mayoría de casos. 

 

Por cierto, ni que decir tiene que estos métodos permiten hacer consultas, o permiten ejecutar cualquier tipo de sql, como pueden ser actualizar, borrar o insertar.


Uso del bloqueador de anuncios adblock

Hola!

Primero de todo bienvenido a la web de NetMentor donde podrás aprender programación en C# y .NET desde un nivel de principiante hasta más avanzado.


Yo entiendo que utilices un bloqueador de anuncios como AdBlock, Ublock o el propio navegador Brave. Pero te tengo que pedir por favor que desactives el bloqueador para esta web.


Intento personalmente no poner mucha publicidad, la justa para pagar el servidor y por supuesto que no sea intrusiva; Si pese a ello piensas que es intrusiva siempre me puedes escribir por privado o por Twitter a @NetMentorTW.


Si ya lo has desactivado, por favor recarga la página.


Un saludo y muchas gracias por tu colaboración

© copyright 2024 NetMentor | Todos los derechos reservados | RSS Feed

Buy me a coffee Invitame a un café