EF Core - Usando ToQueryString() para obter o SQL gerado


 Neste artigo veremos obter e exibir as consultas SQL geradas pelo EF Core a partir das consultas LINQ.


O Entity Framework Core 5.0 trouxe um novo recurso que permite obter as consultas SQL geradas a partir das consultas LINQ.


Este recurso
 é o método ToQueryString() e retorna o SQL específico do provedor sem se conectar ao servidor de banco de dados. Em alguns aspectos ele é semelhante ao método ToTraceString() do Entity Framework.


Para mostrar o recurso eu vou usar um projeto Console onde já temos definidos o EF Core 5.0 e o mapeamento realizado usando a Fluent API para as entidades : Pedido, Item, Cliente e Produto.


Nota:  Para detalhes da criação do projeto e do mapeamento usando a Fluent API veja o seguinte artigo : EF Core - Sistema de Vendas : Usando a Fluent API

Assim o nosso modelo de entidades possui as seguintes definições e associações :
 


Exibindo as consultas SQL usando o método ToQueryString()

Para obter a consulta SQL gerada usando o método ToQueryString() vamos definir o código abaixo no método Main da classe Program:

using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using Vendas.Context;
namespace Vendas
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var db = new ApplicationDbContext();
            var query = db.Pedidos
                              .Include(p => p.Itens)
                              .Where(p => p.PedidoId > 1)
                              .OrderBy(p => p.DataPedido);
            var querystring = query.ToQueryString();
            Console.WriteLine(querystring);
            Console.ReadKey();
        }
    }
}

Executando o projeto teremos o resultado abaixo:

Vemos que o método ToQueryString() nos dá o SQL gerado sem fazer uma solicitação real ao servidor de banco de dados.

Além disso podemos copiar essa consulta SQL para o SQL Server Management Studio (SSMS) ou alguma outra ferramenta de banco de dados para investigar a consulta mais de perto. Ela está pronta para ser executado sem nenhuma modificação.

Atualmente a limitação deste recurso esta em que não podemos usar o método ToQueryString() para descobrir como a consulta é modificada por métodos que enviam a consulta ao banco de dados como - FirstOrDefault (), Count (), etc.

E estamos conversados...

"Eu rogo por eles; não rogo pelo mundo, mas por aqueles que me deste, porque são teus.
E todas as minhas coisas são tuas, e as tuas coisas são minhas; e neles sou glorificado."
João 17:9,10

Referências:


José Carlos Macoratti