¿Cómo veo el SQL generado por el marco de la entidad?
(En mi caso particular, estoy usando el proveedor mysql, si es importante)
¿Cómo veo el SQL generado por el marco de la entidad?
(En mi caso particular, estoy usando el proveedor mysql, si es importante)
Respuestas:
Puedes hacer lo siguiente:
o en EF6:
Eso le dará el SQL que se generó.
fuente
.Single()
su objeto ya no estáIQueryable
, supongo.result
aSystem.Data.Entity.Infrastructure.DbQuery<T>
, luego obtener propiedad internaInternalQuery
como(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, y solo entonces, usarToTraceString()
result.ToString()
Para aquellos que usan Entity Framework 6 y versiones posteriores, si desea ver el SQL de salida en Visual Studio (como lo hice), debe usar la nueva funcionalidad de registro / intercepción.
Agregar la siguiente línea escupirá el SQL generado (junto con detalles adicionales relacionados con la ejecución) en el panel de salida de Visual Studio:
Más información sobre cómo iniciar sesión en EF6 en esta ingeniosa serie de blogs: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Nota: Asegúrese de ejecutar su proyecto en modo DEPURAR.
fuente
Comenzando con EF6.1, puede usar Interceptores para registrar un registrador de base de datos. Vea los capítulos "Interceptores" y "Operaciones de base de datos de registro" a un archivo aquí
fuente
Si está utilizando un DbContext, puede hacer lo siguiente para obtener el SQL:
fuente
ToString()
le dará la consulta con variables, comop__linq__0
, en lugar de los valores finales (por ejemplo: 34563 en lugar dep__linq__0
)Aplicable para EF 6.0 y superior: para aquellos de ustedes que quieran saber más sobre la funcionalidad de registro y agregar algunas de las respuestas ya dadas.
Cualquier comando enviado desde el EF a la base de datos ahora se puede registrar. Para ver las consultas generadas desde EF 6.x, use el
DBContext.Database.Log property
Lo que se registra
Ejemplo:
Salida:
Para iniciar sesión en un archivo externo:
Más información aquí: Registro e interceptación de operaciones de bases de datos
fuente
Puede hacer lo siguiente en EF 4.1:
Eso le dará el SQL que se generó.
fuente
ToString()
salida es el espacio de nombres de ese tipo personalizado. Por ejemplo, si el código anterior fueraselect new CustomType { x = x.Name }
, el valor devuelto sería algo así comoCompany.Models.CustomType
el SQL generado.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
para mí.Mi respuesta aborda EF core . Me refiero a este problema de github y los documentos sobre la configuración
DbContext
:Simple
Anule el
OnConfiguring
método de suDbContext
clase (YourCustomDbContext
) como se muestra aquí para usar ConsoleLoggerProvider; sus consultas deben iniciar sesión en la consola:Complejo
Este caso complejo evita anular el
DbContext
OnConfiguring
método. , lo que se desaconseja en los documentos: "Este enfoque no se presta a las pruebas, a menos que las pruebas se dirijan a la base de datos completa".Este caso complejo utiliza:
IServiceCollection
enStartup
claseConfigureServices
(en lugar de anular elOnConfiguring
método; el beneficio es un acoplamiento más flexible entre elDbContext
y elILoggerProvider
que desea usar)ILoggerProvider
(en lugar de utilizar laConsoleLoggerProvider
implementación que se muestra arriba; el beneficio es que nuestra implementación muestra cómo iniciaríamos sesión en el archivo (no veo un proveedor de registro de archivos enviado con EF Core ))Me gusta esto:
Aquí está la implementación de a
MyLoggerProvider
(y suMyLogger
que agrega sus registros a un archivo que puede configurar; sus consultas de EF Core aparecerán en el archivo).fuente
Hay dos maneras:
ToTraceString()
. Puede agregarlo a su ventana de observación y establecer un punto de interrupción para ver cuál sería la consulta en cualquier punto dado para cualquier consulta LINQ.tail -f
. Puede obtener más información sobre las instalaciones de registro de MySQL en la documentación oficial . Para SQL Server, la forma más fácil es utilizar el generador de perfiles de SQL Server incluido.fuente
Para tener la consulta siempre a mano, sin cambiar el código, agregue esto a su DbContext y verifíquelo en la ventana de salida en Visual Studio.
Similar a la respuesta de @Matt Nibecker, pero con esto no tiene que agregarlo en su código actual, cada vez que necesita la consulta.
fuente
SQL Management Studio => Herramientas => Analizador de SQL Server
Archivo => Nuevo seguimiento ...
Utilice la plantilla => en blanco
Selección de evento => T-SQL
Comprobación del lado izquierdo para: SP.StmtComplete
Los filtros de columna se pueden usar para seleccionar un nombre de aplicación o nombre de base de datos específico
Comience a ejecutar ese perfil y luego active la consulta.
Haga clic aquí para obtener información de la Fuente
fuente
Bueno, en este momento estoy usando el generador de perfiles Express para ese propósito, el inconveniente es que solo funciona para MS SQL Server. Puede encontrar esta herramienta aquí: https://expressprofiler.codeplex.com/
fuente
Devolverá la consulta sql. Trabajar con el contexto de datos de EntityFramework 6
fuente
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping en2[System.Int32,String]]
lugar de la consulta real. ¿Me estoy perdiendo algo o te olvidaste de mencionar algo?Estoy haciendo una prueba de integración, y necesitaba esto para depurar la declaración SQL generada en Entity Framework Core 2.1, así que uso
DebugLoggerProvider
o meConsoleLoggerProvider
gusta así:Aquí hay un ejemplo de salida de la consola de Visual Studio:
fuente
Nigromancia
Esta página es el primer resultado de búsqueda cuando se busca una solución para cualquier .NET Framework, así que aquí, como servicio público, cómo se hace en EntityFramework Core (para .NET Core 1 y 2):
Y luego estos métodos de extensión (IQueryableExtensions1 para .NET Core 1.0, IQueryableExtensions para .NET Core 2.0):
fuente
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
En mi caso para EF 6+, en lugar de usar esto en la ventana Inmediato para encontrar la cadena de consulta:
Terminé teniendo que usar esto para obtener el comando SQL generado:
Por supuesto, su firma de tipo anónimo puede ser diferente.
HTH
fuente
Acabo de hacer esto:
Y el resultado que se muestra en la Salida :
fuente
Para mí, usando EF6 y Visual Studio 2015, ingresé
query
en la ventana inmediata y me dio la instrucción SQL generadafuente
Si desea tener valores de parámetros (no solo
@p_linq_0
sino también sus valores), puede usarIDbCommandInterceptor
y agregar algunos registros alReaderExecuted
método.fuente
Si bien hay buenas respuestas aquí, ninguna resolvió mi problema por completo (deseaba obtener la declaración SQL completa, incluidos los parámetros , del DbContext de cualquier IQueryable. El siguiente código hace exactamente eso. Es una combinación de fragmentos de código de Google. I solo lo he probado con EF6 + .
Solo a un lado, esta tarea me llevó mucho más tiempo de lo que pensaba. La abstracción en Entity Framework es un poco demasiado, en mi humilde opinión.
Primero el uso. Necesitará una referencia explícita a 'System.Data.Entity.dll'.
La siguiente clase convierte un IQueryable en un DataTable. Modifique según su necesidad:
Para usar, simplemente llámelo de la siguiente manera:
fuente
Entity Framework 4 Solution
La mayoría de las respuestas aquí fueron específicas de EF6. Aquí hay uno para aquellos que todavía usan EF4.
Este método reemplaza el
@p__linq__0
/ etc. parámetros con sus valores reales, por lo que puede copiar y pegar la salida en SSMS y ejecutarla o depurarla.fuente