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.