Con la eliminación de Entity Framework Core, dbData.Database.SqlQuery<SomeModel>
no puedo encontrar una solución para crear una consulta SQL sin procesar para mi consulta de búsqueda de texto completo que devolverá los datos de las tablas y también el rango.
El único método que he visto para crear una consulta SQL sin procesar en Entity Framework Core es a través de la dbData.Product.FromSql("SQL SCRIPT");
cual no es útil ya que no tengo un DbSet que asigne el rango que devuelvo en la consulta.
¿¿¿Algunas ideas???
c#
entity-framework-core
David Harlow
fuente
fuente
Respuestas:
Depende de si está utilizando EF Core 2.1 o EF Core 3 y versiones superiores .
Si está usando 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 característica propuesta, que es el tipo de consulta.
¿Qué es el tipo de consulta ?
¿Cuándo usar el tipo de consulta?
Por lo tanto, ya no necesita hacer todos los trucos o soluciones alternativas propuestos como respuestas a su pregunta. Solo sigue estos pasos:
Primero definió una nueva propiedad de tipo
DbQuery<T>
dondeT
es el tipo de la clase que llevará los valores de columna de su consulta SQL. Entonces en tuDbContext
tendrás esto:En segundo lugar, use el
FromSql
método como lo hace conDbSet<T>
:También tenga en cuenta que las
DdContext
s son clases parciales , por lo que puede crear uno o más archivos separados para organizar sus definiciones de 'SQL DbQuery sin procesar' como mejor le convenga.Si usa EF Core 3.0 y versiones superiores
El tipo de consulta ahora se conoce como tipo de entidad sin clave . Como se dijo anteriormente, los tipos de consulta se introdujeron en EF Core 2.1. Si está utilizando EF Core 3.0 o una versión superior, ahora debería considerar el uso de tipos de entidad sin clave porque los tipos de consulta ahora están marcados como obsoletos.
Todavía tenemos los mismos escenarios que para los tipos de consulta sobre cuándo usar el tipo de entidad sin clave.
Entonces, para usarlo, primero debe marcar su clase
SomeModel
con[Keyless]
anotación de datos o mediante una configuración fluida con la.HasNoKey()
llamada al método como se muestra a continuación:Después de esa configuración, puede usar uno de los métodos que se explican aquí para ejecutar su consulta SQL. Por ejemplo, puede usar este:
fuente
bit
)?[NotMapped]
a laSomeModels
clase no funciona para mí. ¿Yo me perdí algo?DbQuery
a favor de usar soloDbSet
con tipos de entidad sin clave .modelBuilder.Entity<MyData>().HasNoKey().ToView(null);
@ Jean-Paul, creo que esto resuelve su problemaSobre la base de las otras respuestas, he escrito este ayudante que realiza la tarea, incluido el uso de ejemplo:
Uso:
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í .
fuente
En EF Core ya no puede ejecutar sql sin formato "gratis". Debe definir una clase POCO y una
DbSet
para esa clase. En su caso, deberá definir el Rango :Como seguramente será de solo lectura, será útil incluir la
.AsNoTracking()
llamada.EDITAR: cambio radical en EF Core 3.0:
DbQuery () ahora está obsoleto, en su lugar, DbSet () debería usarse (nuevamente). Si tiene una entidad sin clave, es decir, no requiere una clave principal, puede usar el método HasNoKey () :
Puede encontrar más información aquí
fuente
DbContext
para incluir una nueva propiedadDbSet<Rank> Rank { get; set; }
. ¿Qué implicaciones tendrá esto ahora en referencia a linq? Es decir, ¿no podremos ahora usar una declaración comoDBContext.Rank.Where(i => i.key == 1)
, y esta declaración no tendrá implementación en SQL y, por lo tanto, fallará?Puede ejecutar sql sin procesar en EF Core: agregue esta clase a su proyecto. Esto le permitirá ejecutar SQL sin procesar y obtener los resultados sin tener que definir un POCO y un DBSet. Consulte https://github.com/aspnet/EntityFramework/issues/1862#issuecomment-220787464 para ver el ejemplo original.
Aquí hay un ejemplo de cómo usarlo:
fuente
Por ahora, hasta que haya algo nuevo de EFCore, usaría un comando y lo mapearía manualmente
Intente SqlParameter para evitar la inyección de SQL.
FromSql no funciona con una consulta completa. Por ejemplo, si desea incluir una cláusula WHERE, se ignorará.
Algunos enlaces:
Ejecución de consultas SQL sin procesar mediante Entity Framework Core
Consultas SQL sin procesar
fuente
En Core 2.1 puede hacer algo como esto:
y luego defina su procedimiento SQL, como:
De esta manera, el modelo de Ranks no se creará en su base de datos.
Ahora en su controlador / acción puede llamar:
De esta forma puede llamar a Procedimientos SQL sin formato.
fuente
FromSql
parámetros podrían simplemente pasarse sin crear unSqlParameter
objeto:FromSql($"STORED_PROCEDURE {value1}, {value2}")
oFromSql("STORED_PROCEDURE {0}, {1}", value1, value2)
(se escaparán).Puede usar esto (de https://github.com/aspnet/EntityFrameworkCore/issues/1862#issuecomment-451671168 ):
Y el uso:
fuente
Agregar paquete Nuget - Microsoft.EntityFrameworkCore.Relational
Esto devolverá los números de fila como un int
Ver - https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.executesqlcommand?view=efcore-3.0
fuente
prueba esto: (crear método de extensión)
Uso:
mi modelo: (no en
DbSet
):Nota: esta solución tiene un rendimiento lento
fuente
No apuntando directamente al escenario del OP, pero como he estado luchando con esto, me gustaría eliminar estos ex. métodos que facilitan la ejecución de SQL sin formato con
DbContext
:fuente
Solía apuesto a esta restricción de derivación de Entity Framework Core.
está trabajando con una consulta SQL o un procedimiento almacenado con múltiples parámetros. Por cierto, es un poco más rápido (ver pruebas comparativas )
Dapper es fácil de aprender. Tomó 15 minutos escribir y ejecutar el procedimiento almacenado con parámetros. De todos modos, puede usar EF y Dapper. A continuación se muestra un ejemplo:
fuente
También puede utilizar QueryFirst . Como Dapper, esto está totalmente fuera de EF. A diferencia de Dapper (o EF), no necesita mantener el POCO, edita su SQL SQL en un entorno real y se revalida continuamente contra la base de datos. Descargo de responsabilidad: soy el autor de QueryFirst.
fuente
Mi caso usó procedimiento almacenado en lugar de SQL sin formato
Creó una clase
Agregado a continuación en mi
DbContext
clasePara ejecutar el procedimiento almacenado:
fuente
Sé que es una pregunta antigua, pero tal vez ayude a alguien a llamar a procedimientos almacenados sin agregar DTO como DbSets.
https://stackoverflow.com/a/62058345/3300944
fuente
Esta solución se apoya en gran medida en la solución de @pius. Quería agregar la opción para admitir parámetros de consulta para ayudar a mitigar la inyección de SQL y también quería convertirlo en una extensión de DbContext DatabaseFacade para Entity Framework Core para hacerlo un poco más integrado.
Primero crea una nueva clase con la extensión:
Tenga en cuenta en lo anterior que "T" es el tipo para la devolución y "P" es el tipo de los parámetros de su consulta que variarán en función de si está utilizando MySql, Sql, etc.
A continuación mostraremos un ejemplo. Estoy usando la capacidad MySql EF Core, por lo que veremos cómo podemos usar la extensión genérica anterior con esta implementación de MySql más específica:
La consulta devolvería filas como:
"Ford", "Explorer", "Ford Explorer"
"Tesla", "Model X", "Tesla Model X"
El título de visualización no está definido como una columna de la base de datos, por lo que no sería parte del modelo EF Car de forma predeterminada. Me gusta este enfoque como una de las muchas posibles soluciones. Las otras respuestas en esta página hacen referencia a otras formas de abordar este problema con el decorador [NotMapped], que según su caso de uso podría ser el enfoque más apropiado.
Tenga en cuenta que el código en este ejemplo es obviamente más detallado de lo que debería ser, pero pensé que aclaraba el ejemplo.
fuente
Con Entity Framework 6 puede ejecutar algo como a continuación
Ejecute el comando Raw DQL SQl como se muestra a continuación:
fuente