Esse artigo faz parte da revista .NET Magazine edição 53. Clique aqui para ler todos os artigos desta edição

T-FAMILY: Verdana; mso-ansi-language: PT-BR">Boas Práticas - Novidades – Web - Tutorial

LINQ x NHibernate

Desvendando o ADO.NET Entity Framework

 

Nesse artigo veremos

·                         LINQ to SQL;

·                         LINQ to Entities;

·                         NHibernate;

·                         ASP.NET 3.5.

Qual a finalidade

·                         Comparar o LINQ e NHibernate.

Quais situações utilizam esses recursos?

·                         Aplicações orientadas a dados.

Resumo do DevMan

O LINQ (através do ADO.NET Entity) e NHibernate permitem fazer o mapeamento objeto/relacional em uma aplicação. Veja neste artigo como usar ambas as soluções, um comparativo e uma conclusão.

 

Se não for a principal, uma das principais novidades que surgiu com o .NET Framework 3.5 é o LINQ (Language Integrated Query) e suas extensões. Uma linguagem gerenciada que suporta a consulta a dados das fontes mais diversas: Databases relacionais, Arquivos XML, Arrays, objetos etc.

Um dos principais “sabores” do LINQ, que vem ganhando muito espaço ultimamente, é o LINQ to SQL. O LINQ to SQL, também conhecido como DLINQ, é uma forma muito elegante de criarmos um modelo de classes baseado em tabelas de um banco de dados. Tem um mecanismo muito parecido com o dos DataSet Tipados (ADO.NET 2.0) e por isso vem ganhando bastante espaço.

Porém, algumas limitações nos levam a questionar se o LINQ to SQL é realmente uma ferramenta O/RM (ferramentas de Mapeamento Objeto/Relacional – veja detalhes na Nota do DevMan). E para preencher essas lacunas a Microsoft vem trabalhando no LINQ to Entities, ou num contexto mais abrangente o ADO.NET Entity Framework.

Em outra vertente temos o NHibernate, uma ferramenta O/RM livre para .NET, que já está bastante consagrada no mercado e possui uma grande quantidade de adeptos. O objetivo deste artigo é fazer um comparativo entre o LINQ e o NHibernate, mas por motivos que serão detalhados a seguir, essa á uma comparação inútil já que o LINQ por si só não é uma ferramenta O/RM.

O que iremos fazer, portanto, é um comparativo entre o NHibernate e o LINQ to Entities, com o objetivo de identificarmos os pontos positivos e negativos destas duas ótimas ferramentas de Mapeamento Objeto/Relacional.

        

Nota do DevMan

Mapeamento objeto-relacional (ou ORM) é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada a objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registos de cada tabela são representados como instâncias das classes correspondentes.

Com esta técnica, o programador não precisa se preocupar com os comandos em linguagem SQL; irá usar uma interface de programação simples que faz todo o trabalho de persistência.

Não é necessária uma correspondência direta entre as tabelas de dados e as classes do programa. A relação entre as tabelas onde originam os dados e o objeto que os disponibiliza é configurada pelo programador, isolando o código do programa das alterações à organização dos dados nas tabelas do banco de dados.

A forma como este mapeamento é configurado depende da ferramenta que será utilizada. Como exemplo, o programador que use Hibernate na linguagem Java (ou Nhibernate para .NET) pode usar arquivos XML ou o sistema de anotações que a linguagem providencia.

Alguns exemplos de Ferramentas O/RM são:

- SQLObject : Um poderoso sistema ORM para Python;

- Hibernate : Uma ferramenta de mapeamento objeto relacional para Java;

- NHibernate : Uma ferramenta de mapeamento objeto relacional para .NET;

- OJB : Uma ferramenta de mapeamento objeto relacional para Java, da Apache Software Foundation;

- Django (framework web) : Framework de desenvolvimento web escrito em Python que possui um ORM próprio;

- LINQ to Entities : Ferramenta O/RM da Microsoft baseada na linguagem LINQ.

Além dessas, podemos citar as seguintes ferramentas para .NET, que de uma forma ou outra tentam atender a essa necessidade: .NET Persistence, BBADataObjects, DataObjects.NET, Data Tier Modeler for .NET, DotNorm, Eldorado.NET, Entity Broker, eXpress Persistent Objects for .NET, FastObjects.NET, JC Persistent Framework, LLBLGen Pro, ModelWorks, Nolics.NET, Norm, Norpheme, ObjectBroker, ObjectSpaces, ObjectSpark, Objectz.NET, OJB.NET, OPF.Net (Object Persistent Framework), ORM.NET, Pragmatier Data Tier Builder, RapTier, Sisyphus Persistence Framework, TierDeveloper, Bob.NET, ObjectPersistor.NET, Genome.

 

LINQ

É importante que tenhamos muito bem definido o que é o LINQ e quais são as diferenças entre ele e suas vertentes: LINQ to SQL e LINQ to Entities.

Como já foi dito o LINQ (Language Integrated Query) é uma linguagem de código gerenciado para a consulta de dados de fontes diversas. Em outras palavras o LINQ é um componente do .NET que adiciona capacidades nativas de consulta a dados nas linguagens .NET, usando uma sintaxe parecida com a da linguagem SQL.

Só para efeito de ilustração, na Listagem 1 temos um comando SELECT simples e bastante conhecido da linguagem SQL. Na Listagem 2 temos o seu equivalente no LINQ, utilizando a linguagem C#.

 

Listagem 1. SELECT Linguagem SQL

 

SELECT ProductID, ProductName, UnitPrice, UnitsInStock FROM Products

         WHERE CategoryID = 2

         ORDER BY ProductName

 

Listagem 2. SELECT LINQ/C#

 

from p in Products

         where p.CategoryID == 2

         orderby p.ProductName

         select new { p.ProductID, p.ProductName, p.UnitPrice, p.UnitsInStock }

 

Uma ótima ferramenta para se aprender a utilizar a sintaxe LINQ é o LINQPad, ferramenta gratuita do Joseph Albahari, que você pode fazer o download aqui  http://www.linqpad.net/.

Com o LINQPad você cria conexões com seus databases e dispara queries usando o LINQ, assim como fazemos nas Queries do SQL Server. Outra vantagem é que você tem uma série de exemplos, além da possibilidade de disparar comandos SQL para fazer comparações entre as linguagens. É uma ótima ferramenta para aprender e ganhar experiência na sintaxe LINQ.

Uma definição bastante abrangente e interessante, você também pode encontrar no Wikipedia, através deste link: http://en.wikipedia.org/wiki/LINQ .

 

LINQ to SQL

O LINQ to SQL, apesar de algumas limitações pode ser considerado uma ferramenta O/RM, já que nos permite realizar um mapeamento entre as tabelas de um banco de dados do SQL Server e classes .NET.

Seguindo a linha RAD (Rapid Application Development) que já é presente desde as primeiras versões do ADO.NET para a criação de DataSets Tipados, podemos criar os nossas classes LINQ to SQL de uma forma bastante fácil e intuitiva.

Em projetos do Visual Studio 2008 com .NET Framework 3.5, você pode criar as classes LINQ to SQL usando o template LINQ to SQL Classes, veja na Figura 1.

 

Figura 1. Utilizando o Template LINQ to SQL Classes

 

E para criar as classes (e seus respectivos mapeamentos), basta criar uma conexão com o seu database na Server Explorer, e arrastar as tabelas que desejar para o Designer Surface do LINQ to SQL, como mostra a Figura 2.

 

Figura 2. Criando Mapeamento com LINQ to SQL Classes

 

Veja que essa é uma forma bastante simples e ágil de se mapear as tabelas de um database em classes de um modelo de objetos. Apenas para ilustrarmos a diferença que esse modelo tem com relação ao antigo ADO.NET 2.0, veja na Listagem 3 como seria feita uma consulta na tabela de produtos da forma convencional. E na Listagem 4, veja como a mesma consulta é feita com o LINQ to SQL.

 

Listagem 3. Código para consulta no database em ADO.NET 2.0

 

SqlConnection Conexao = new SqlConnection(

"Data Source=(local);Initial Catalog=Northwind;Integrated

Security=True");

...

Quer ler esse conteúdo completo? Tenha acesso completo