Basta ya de buscar por todo internet porque has llegado al lugar adecuado, tenemos la solución que quieres hallar pero sin complicaciones.
Solución:
Depende si estás usando EF Núcleo 2.1 o EF Core 3 y versiones superiores.
Si está utilizando EF Core 2.1
Si usa EF Core 2.1 Release Candidate 1 disponible desde el 7 de mayo de 2018, puede aprovechar la nueva función propuesta que es el tipo Consulta.
¿Qué es el tipo de consulta?
Además de los tipos de entidad, un modelo de EF Core puede contener tipos de consulta, que se pueden usar para realizar consultas de base de datos en datos que no están asignados a tipos de entidad.
¿Cuándo usar el tipo de consulta?
Sirve como tipo de devolución para consultas ad hoc FromSql().
Mapeo a vistas de base de datos.
Asignación a tablas que no tienen un primario key definido.
Mapeo a consultas definidas en el modelo.
Por lo tanto, ya no necesita hacer todos los trucos o soluciones propuestas como respuestas a su pregunta. Solo sigue estos pasos:
Primero definiste una nueva propiedad de tipo DbQuery
donde T
es el tipo de la clase que llevará los valores de columna de su consulta SQL. Así que en tu DbContext
tendrás esto:
public DbQuery SomeModels get; set;
segundo uso FromSql
método como lo haces con DbSet
:
var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();
También tenga en cuenta que DdContext
s son clases parciales, por lo que puede crear uno o más archivos separados para organizar sus definiciones ‘raw SQL DbQuery’ como mejor se adapte a sus necesidades.
Si está utilizando EF Core 3.0 y versiones superiores
El tipo de consulta ahora se conoce como tipo de entidad Keyless. Como se dijo anteriormente, los tipos de consulta se introdujeron en EF Core 2.1. Si usa EF Core 3.0 o una versión superior, ahora debería considerar usar tipos de entidad sin clave porque los tipos de consulta ahora están marcados como obsoletos.
Esta función se agregó en EF Core 2.1 con el nombre de tipos de consulta. En EF Core 3.0, se cambió el nombre del concepto a tipos de entidades sin llave. los
[Keyless] La anotación de datos estuvo disponible en EFCore 5.0.
Todavía tenemos los mismos escenarios que para los tipos de consulta sobre cuándo usar el tipo de entidad sin llave.
Entonces, para usarlo, primero debe marcar su clase SomeModel
con [Keyless]
anotación de datos o a través de una configuración fluida con .HasNoKey()
llamada al método como a continuación:
public DbSet SomeModels get; set;
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity().HasNoKey();
Después de esa configuración, puede usar uno de los métodos explicados aquí para ejecutar su consulta SQL. Por ejemplo puedes usar este:
var result = context.SomeModels.FromSqlRaw("SQL SCRIPT").ToList();
Sobre la base de las otras respuestas, he escrito este ayudante que realiza la tarea, incluido el uso de ejemplo:
public static class Helper
{
public static List RawSqlQuery(string query, Func map)
using (var context = new DbContext())
using (var command = context.Database.GetDbConnection().CreateCommand())
command.CommandText = query;
command.CommandType = CommandType.Text;
context.Database.OpenConnection();
using (var result = command.ExecuteReader())
var entities = new List();
while (result.Read())
entities.Add(map(result));
return entities;
Uso:
public class TopUser
public string Name get; set;
public int Count get; set;
var result = Helper.RawSqlQuery(
"SELECT TOP 10 Name, COUNT(*) FROM Users U"
+ " INNER JOIN Signups S ON U.UserId = S.UserId"
+ " GROUP BY U.Name ORDER BY COUNT(*) DESC",
x => new TopUser Name = (string)x[0], Count = (int)x[1] );
result.ForEach(x => Console.WriteLine($"x.Name,-25x.Count"));
Planeo deshacerme de él tan pronto como se agregue el soporte integrado. Según una declaración de Arthur Vickers del equipo EF Core, es una alta prioridad para la publicación 2.0. El problema se está rastreando aquí.
En EF Core, ya no puede ejecutar sql sin formato “gratuito”. Debe definir una clase POCO y un DbSet
para esa clase. En su caso tendrá que definir Rango:
var ranks = DbContext.Ranks
.FromSql("SQL_SCRIPT OR STORED_PROCEDURE @p0,@p1,...etc", parameters)
.AsNoTracking().ToList();
Como seguramente será de solo lectura, será útil incluir el .AsNoTracking()
llamada.
EDITAR – Cambio importante en EF Core 3.0:
DbQuery() ahora está obsoleto, en cambio DbSet() debe usarse (otra vez). Si tiene una entidad sin llave, es decir, no requiere primaria keypuedes usar No tiene clave () método:
ModelBuilder.Entity().HasNoKey()
Más información se puede encontrar aquí