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: