Entity SQL

E ai pessoal, já faz um tempinho que eu não falo de LINQ então vou falar rapidamente sobre uma funcionalidade do Entity Framework que eu considero como essencial, mas que poucos desenvolvedores ainda conhecem. Estou falando do Entity SQL. Uma linguagem similar ao conhecido Transact-SQL (T-SQL) voltada para consultas às entidades mapeadas pelo Entity Framework direto no modelo conceitual.

Pode até parecer estranho que se possa utilizar uma linguagem SQL para consultas ao Entity Framework já que ele realiza o Mapeamento Objeto Relacional visando diminuir a impedância da aplicação. Mas entendamos que quando ele foi desenhado o LINQ já existia e foi apenas incorporado ao seu funcionando, mas que devido a sua gama de funções e facilidades de uso se tornou seu principal meio de consulta.

A principal vantagem em utilizar o Entity SQL é a possibilidade de realizar consultas que não são possíveis ou que se tornam muito complicadas com o LINQ to Entities, por exemplo:

  • Conversões dentro da query (o LINQ to Entities não suporta, por exemplo, que você utilize códigos como int.parse() dentro das consultas: o erro abaixo será mostrado em tempo de execução: LINQ to Entities does not recognize the method ‘Int32 Parse(System.String)’ method, and this method cannot be translated into a store expression.
  • Consultas dinâmicas que sua query seja montada durante a execução. Já vi códigos em LINQ gigantescos ou vários códigos LINQ um abaixo do outro dentro de vários IF-ELSE para conseguir fazer isto.
  • Melhor para fazer filtros e ordenações de forma dinâmica.

1 – Consultas Básicas

Para começar, entenda que o mapeamento ainda é necessário e que tudo acontece passando pelo nosso Objeto de Contexto.

As consultas poderão ser realizas utilizando o objeto de contexto, por exemplo:


//Listandos os produtos que tem valor maior que 1000 e menor igual a 3000
//Para este caso o uso do it. é obrigatorio, sem ele o campo não será encontrado
List<Produto> lstProdutos = ex.Produto.Where("it.valor > 1000 && it.valor <=3000").ToList();

Ou utilizando o ObjectQuery, informando qual a entidade que será consultada, por exemplo:


//Instanciando a classe ObjectQuery passamos como parâmetros a consulta e o objeto de contexto
//A Consulta se assemelha muito a um SQL tradicional
ObjectQuery<Produto> queryProdutos = new ObjectQuery<Produto>( "select VALUE p from Produto as p where p.valor >2000", ex);
lstProdutos = queryProdutos.ToList();

Sobre a consulta acima, notem que:

–      O VALUE faz o papel de * do nosso conhecido e temido SELECT * FROM. Caso se tente colocar o * mesmo assim, o seguinte erro será mostrado em tempo de execução: he query syntax is not valid. Near term ‘*’

–      Apesar de extensa, essa consulta não é obrigatória,ela pode ser substituída apenas pelo nome da entidade.

2 – Consultas dinâmicas, Ordenação e Filtros

O aspecto mais legal e que mais recomendo para a utilização do Entity SQL é justamente para aplicação de filtros e ordenadores. O LINQ mantém isso muito amarrado, não é possível por exemplo eu ordenar um consulta a minha entidades produtos alternando a ordenação entre o valor do produto ou o nome dele.  Para casos assim eu já vi a seguinte solução:


exampleEntities ex = new exampleEntities();
List<Produto> lstProdutos = null;
string ordenador = "";

 //Valor selecionado pelo usuário: CPF
ordenador = "Nome";
 switch (ordenador)
{
case "Id": lstProdutos = ex.Produto.OrderBy(c => c.Id).ToList();
break;
case "Nome": lstProdutos = ex.Produto.OrderBy(c => c.Nome).ToList();
break;
case "Valor": lstProdutos = ex.Produto.OrderBy(c => c.Valor).ToList();
break;
}

Vejam que não é uma solução muito elegante e bastante repetitiva, sem falar que qualquer nova coluna na tabela da entidade obrigará a mudanças no código.

Sendo assim, vamos refazer o exemplo utilizando o Entity SQL a nosso favor:


exampleEntities ex = new exampleEntities();
List<Produto> lstProdutos = null;
string ordenador = "";
 //Valor selecionado pelo usuário: Valor
ordenador = "Valor";

//Desta vez irei passar somente o nome da entidade no parâmetro de consulta
ObjectQuery<Produto> queryProdutos = new ObjectQuery<Produto>("Produto", ex);

 //chamamos o método OrdeyBy passando uma string que nada mais é do que
//a concatenação do it. e o nome da coluna desejada para ordenação
lstProdutos = queryProdutos.OrderBy(string.Format("it.{0}", ordenador)).ToList();

Ta bom por enquanto. Depois eu posto mais algumas coisas legais que se pode fazer com Entity SQL!!


Anúncios
Esse post foi publicado em LINQ. Bookmark o link permanente.

Uma resposta para Entity SQL

  1. Excelente! Muita gente tem dúvidas que podem ser solucionadas com o Entity SQL… Parabéns!
    []’s,
    André.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s