Como visualizo o SQL gerado pela estrutura da entidade?
(No meu caso em particular, estou usando o provedor mysql - se isso importa)
Como visualizo o SQL gerado pela estrutura da entidade?
(No meu caso em particular, estou usando o provedor mysql - se isso importa)
Respostas:
Você pode fazer o seguinte:
ou no EF6:
Isso fornecerá o SQL que foi gerado.
fonte
.Single()
seu objeto não existe mais,IQueryable
eu acho.result
paraSystem.Data.Entity.Infrastructure.DbQuery<T>
, em seguida, obter propriedade internaInternalQuery
como(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, e só então, o usoToTraceString()
result.ToString()
Para aqueles que usam o Entity Framework 6 e superior, se quiser exibir o SQL de saída no Visual Studio (como eu fiz), use a nova funcionalidade de log / interceptação.
A adição da seguinte linha cuspirá o SQL gerado (junto com detalhes adicionais relacionados à execução) no painel de saída do Visual Studio:
Mais informações sobre o logon no EF6 nesta série de blogs bacana: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Nota: Verifique se você está executando seu projeto no modo DEBUG.
fonte
A partir do EF6.1, você pode usar o Interceptors para registrar um criador de logs de banco de dados. Consulte os capítulos "Interceptores" e "Registrando operações do banco de dados" em um arquivo aqui
fonte
Se você estiver usando um DbContext, poderá fazer o seguinte para obter o SQL:
fonte
ToString()
vai dar-lhe a consulta com variáveis nele, comop__linq__0
, em vez dos valores finais (por exemplo: 34563 em vez dep__linq__0
)Aplicável ao EF 6.0 e superior: para aqueles que desejam saber mais sobre a funcionalidade de log e adicionar algumas das respostas já fornecidas.
Qualquer comando enviado do EF ao banco de dados agora pode ser registrado. Para visualizar as consultas geradas do EF 6.x, use o
DBContext.Database.Log property
O que é registrado
Exemplo:
Resultado:
Para fazer logon em um arquivo externo:
Mais informações aqui: Registrando e interceptando operações do banco de dados
fonte
Você pode fazer o seguinte no EF 4.1:
Isso fornecerá o SQL que foi gerado.
fonte
ToString()
saída será o espaço para nome desse tipo personalizado. Por exemplo, se o código acima fosseselect new CustomType { x = x.Name }
, o valor retornado seria algo como, emCompany.Models.CustomType
vez do SQL gerado.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
para mim.Minha resposta aborda o núcleo da EF . Mencionei esse problema do github e os documentos sobre a configuração
DbContext
:Simples
Substitua o
OnConfiguring
método da suaDbContext
classe (YourCustomDbContext
) como mostrado aqui para usar um ConsoleLoggerProvider; suas consultas devem se registrar no console:Complexo
Este caso Complex evita a substituição do
DbContext
OnConfiguring
método. , o que é desencorajado nos documentos: "Essa abordagem não se presta a testes, a menos que os testes tenham como alvo o banco de dados completo".Este caso Complex usa:
IServiceCollection
inStartup
classConfigureServices
(em vez de substituir oOnConfiguring
método; o benefício é um acoplamento mais flexível entre oDbContext
e o queILoggerProvider
você deseja usar)ILoggerProvider
(em vez de usar aConsoleLoggerProvider
implementação mostrada acima; o benefício é nossa implementação mostra como faríamos logon no arquivo (não vejo um provedor de log de arquivo enviado com o EF Core ))Como isso:
Aqui está a implementação de um
MyLoggerProvider
(e seuMyLogger
que anexa seus logs a um arquivo que você pode configurar; suas consultas do EF Core serão exibidas no arquivo).fonte
Existem duas maneiras:
ToTraceString()
. Você pode adicioná-lo à sua janela de inspeção e definir um ponto de interrupção para ver qual seria a consulta em um determinado momento para qualquer consulta LINQ.tail -f
. Você pode aprender mais sobre os recursos de registro do MySQL na documentação oficial . Para o SQL Server, a maneira mais fácil é usar o criador de perfil do SQL Server incluído.fonte
Para ter a consulta sempre à mão, sem alterar o código, adicione-o ao seu DbContext e verifique-o na janela de saída no visual studio.
Semelhante à resposta do @Matt Nibecker, mas com isso você não precisa adicioná-lo ao seu código atual, toda vez que precisar da consulta.
fonte
SQL Management Studio => Ferramentas => Profiler do SQL Server
Arquivo => Novo rastreamento ...
Use o Template => Blank
Seleção de evento => T-SQL
Verificação do lado esquerdo para: SP.StmtComplete
Os filtros de coluna podem ser usados para selecionar um ApplicationName ou DatabaseName específico
Inicie esse perfil em execução e inicie a consulta.
Clique aqui para obter informações sobre a fonte
fonte
Bem, no momento estou usando o Express Profiler para esse fim, a desvantagem é que ele só funciona para o MS SQL Server. Você pode encontrar essa ferramenta aqui: https://expressprofiler.codeplex.com/
fonte
Retornará a consulta sql. Trabalhando com o datacontext do EntityFramework 6
fonte
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping em2[System.Int32,String]]
vez da consulta real. Estou faltando alguma coisa ou você esqueceu de mencionar alguma coisa?Eu estou fazendo teste de integração, e precisava disso para depurar a instrução SQL gerado no Entity Framework Core 2.1, então eu uso
DebugLoggerProvider
ouConsoleLoggerProvider
assim:Aqui está um exemplo de saída do console do Visual Studio:
fonte
Necromante.
Esta página é o primeiro resultado da pesquisa ao procurar uma solução para qualquer .NET Framework, portanto, aqui como serviço público, como é feito no EntityFramework Core (para .NET Core 1 e 2):
E, em seguida, esses métodos de extensão (IQueryableExtensions1 para .NET Core 1.0, IQueryableExtensions para .NET Core 2.0):
fonte
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
No meu caso para EF 6+, em vez de usá-lo na janela Immediate para encontrar a string de consulta:
Acabei tendo que usar isso para obter o comando SQL gerado:
É claro que sua assinatura de tipo anônimo pode ser diferente.
HTH.
fonte
Acabei de fazer isso:
E o resultado mostrado na saída :
fonte
Para mim, usando o EF6 e o Visual Studio 2015, entrei
query
na janela imediata e me deu a instrução SQL geradafonte
Se você quiser ter valores de parâmetros (não apenas
@p_linq_0
mas também os valores deles), poderá usarIDbCommandInterceptor
e adicionar algum log aoReaderExecuted
métodofonte
Embora existam boas respostas aqui, nenhum resolveu o meu problema completamente (eu desejava para obter toda a instrução SQL, incluindo parâmetros , a partir do DbContext de qualquer IQueryable. O código a seguir faz exatamente isso. É uma combinação de trechos de código do Google. I só o testaram com EF6 + .
Apenas um aparte, essa tarefa me levou muito mais tempo do que eu pensava. Abstração no Entity Framework é um pouco demais, IMHO.
Primeiro o uso. Você precisará de uma referência explícita ao 'System.Data.Entity.dll'.
A classe a seguir converte um IQueryable em um DataTable. Modifique conforme sua necessidade:
Para usar, basta chamá-lo como abaixo:
fonte
Solução do Entity Framework 4
A maioria das respostas aqui foram específicas do EF6. Aqui está um para aqueles que ainda usam o EF4.
Este método substitui o
@p__linq__0
/ etc. parâmetros com seus valores reais, para que você possa copiar e colar a saída no SSMS e executá-la ou depurá-la.fonte