O desenvolvimento de aplicações para acesso a banco
de dados usando a plataforma .NET não sofreu grandes alterações desde o seu
lançamento. Geralmente você começa definindo o seu banco de dados, tabelas,
relacionamentos, em seguida parte para a definição das classes de forma a
procurar representar o domínio do seu negócio e finalmente usa os mesmos
conceitos abstratos básicos de programação: definindo objetos
Connection, objetos Command,
objetos datareader, objetos
dataset etc.
Muitos desenvolvedores já têm sua biblioteca de
funções prontas ou usam recursos de terceiros ou mesmo da Microsoft, como os
Data Application Blocks.
Ficamos tão acostumados como uma forma de escrever
código que, muitas vezes, não percebemos que temos novos recursos à disposição, que
irão garantir um melhor desempenho e manutenção. Afinal, se está funcionando, é o
que importa, pensamos…
A partir da versão 3.0, e consolidada na versão 3.5
da plataforma .NET, temos um leque de novas funcionalidades que nos dão um ganho
muito grande de produtividade. Uma delas, o foco deste artigo, é o LINQo
SQ tL.
Neste artigo eu vou mostrar como usar os novos
recursos do LINQ to SQL para efetuar o mapeamento para tabelas de um
banco de dados SQL Server e, em seguida, usar os recursos da linguagem LINQ
de forma ter um código enxuto e eficiente. Bem diferente da forma como
estávamos acostumados a fazer.
Vou criar uma aplicação web, mas poderia ser uma
aplicação windows forms, e usando a linguagem VB .NET, vou efetuar o mapeamento
OR/M para uma tabela Alunos do banco de dados Teste.mdf
criado no SQL Server 2005 Express Edition, sem usar
o assistente e o descritor objeto Relacional disponível, dessa forma podemos
entender um pouco melhor como as coisas funcionam.
Como não é objetivo deste artigo, eu não vou mostrar
como criar o banco de dados e a tabela no Visual Web Developer 2008 Express,
mas essa é uma tarefa bem simples. Se você tiver dúvidas, consulte as referências
para maiores detalhes.
Abaixo temos o banco de dados Teste.mdf e a
tabela Alunos definida com os campos: id, nome e email, onde o
campo id é uma chave primária do tipo identity;
Logo depois temos a tabela exibindo alguns dados que eu
incluí para usar no projeto deste artigo.


O banco de dados será copiado na pasta App_Data.
Em seguida defina o arquivo web.config a
string de conexão usada para acessar o banco de dados Teste.mdf:
<connectionStrings><br /> <add name="connectionStringAlunos"<br />connectionString="Data<br />Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and<br />Settings\macoratti\_ <br /> Meus documentos\Visual Studio 2008\Projects\linq_Entities\linq_Entities\App_Data\Teste.mdf';_ <br /> Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/><br /></connectionStrings>Observe que temos o nome connectionStringAlunos
a string de conexão usada.
Nota: Na sua máquina local a
string de conexão pode ser diferente, atente para este detalhe.
No exemplo deste artigo eu vou usar o Visual Web
Developer 2008 Express Edition, que já dá suporte ao
LINQ to SQL e permite efetuar o mapeamento
objeto relacional.
Abra o VWD 2008 e crie um novo web site a
partir do menu File-> New web site com o nome de acessoLINQ usando
a linguagem VB .NET;
A seguir a partir no menu Web Site -> Add New
Item, selecione o template Class e informe o nome LINQ.vb
e clique em Add; (o arquivo será copiado na
pasta App_Code).
Antes de iniciar, clique com o botão direito do
mouse sobre o nome do projeto e selecione Add Reference e, a partir da
janela Add Reference, inclua a referência a
System.Data.Linq;

Agora vamos criar a classe que vai efetuar o
mapeamento OR/M com a tabela Alunos do nosso banco de dados. Veja o
código a seguir:
Imports System<br />Imports System.Data.Linq.Mapping<br /><br /><Table(name:="Alunos")> _<br />Public Class aluno<br /><br /> Private _id As Integer<br /> Private _nome As String<br /> Private _email As String<br /><br /> <Column(IsPrimaryKey:=True, IsDbGenerated:=True)> _<br /> Public Property Id() As Integer<br /> Get<br /> Return _id<br /> End Get<br /> Set(ByVal value As Integer)<br /> _id = value<br /> End Set<br /> End Property<br /><br /> <Column(CanBeNull:=True)> _<br /> Public Property Nome() As String<br /> Get<br /> Return _nome<br /> End Get<br /> Set(ByVal value As String)<br /> _nome = value<br /> End Set<br /> End Property<br /><br /> <Column(CanBeNull:=True)> _<br /> Public Property Email() As String<br /> Get<br /> Return _email<br /> End Get<br /> Set(ByVal value As String)<br /> _email = value<br /> End Set<br /> End Property<br /><br />End ClassDefinimos a
classe aluno mapeada para a tabela Alunos e definimos três propriedades:
- Id()
- Nome()
- Email()
Cada uma delas sendo mapeada para a coluna
correspondente da tabela Alunos;
Com isso já teremos o acesso via entidade
criada no mapeamento.
A classe aluno representa a tabela
Alunos do banco de dados.
Vamos agora criar a interface na página
Default.aspx. Inclua a partir da ToolBox os
seguintes componentes nesta página:
- TextBox – ID=txtNome
- Button – ID=btnProcurar
- GridView – ID=gdvAlunos
Defina o seguinte leiaute na página:

Agora vamos definir o código associado ao evento
Click do botão Procurar:
Protected Sub btnProcurar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnProcurar.Click<br /><br /> Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString<br /> Dim db As New DataContext(conexao)<br /> Dim tAlunos As Table(Of aluno)<br /> tAlunos = db.GetTable(Of aluno)()<br /> gdvAlunos.DataSource = tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))<br /> gdvAlunos.DataBind()<br /><br /> End Sub1. Obtemos a string de conexão a partir do arquivo
web.config:
Dim conexao As String = ConfigurationManager.ConnectionStrings("connectionStringAlunos").ConnectionString.ToString2. Criamos uma instância da classe DataContext
usando a conexão obtida;
Dim db As New DataContext(conexao)3. Definimos um objeto tAlunos do tipo Table(Of )
<br />Dim tAlunos As Table(Of aluno)4. Obtemos a tabela ALunos a partir do
contexto criado através do método GetTable<> que referencia o nome da
classe aluno e não nome da tabela;
tAlunos = db.GetTable(Of aluno)()5. Usamos uma expressão lambda onde selecionamos os
nomes contidos na tabela a partir da expressão informada no TextBox txtNome;
tAlunos.Where(Function(a) a.Nome.Contains(txtNome.Text))Executando o projeto, se nada for informado na
caixa de texto, todos os dados da tabela serão exibidos:

Informando um critério qualquer teremos:

Observe que não nos preocupamos em definir objetos
connection, commands, datareaders ou datasets apenas instanciamos um
contexto a partir do qual tivemos acesso, a partir da classe mapeada para a tabela, aos dados usando uma consulta LINQ.
O código ficou mais enxuto e tivemos menos
trabalho. E isso sem usar o assistente; com ele o trabalho de gerar a classe não
seria necessário. Devemos portanto conhecer os novos recursos para saber avaliar
quando usá-los para obtermos um produto final mais refinado.
Aguarde novos artigos sobre o assunto…
Pegue o projeto completo aqui:
acessoLINQ.zip
Eu sei é apenas LINQ to SQL, mas eu
gosto…
*
Referências:








