Saltar al contenido

Consulta SQL sin procesar sin DbSet – Entity Framework Core

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 DdContexts 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í

Calificaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *