VB 2008 - Apresentando LINQ To SQL II


E lá vou eu novamente falar sobre o LINQ , veja meus artigos anteriores sobre o assunto nos links abaixo:

Este artigo falar um pouco sobre o ambiente do LINQ To SQL explicando os conceitos básicos sobre o seu funcionamento: Descritor , DataContext, etc...

Abra o VB 2008 Express e crie um novo projeto no menu FIle->New Project do tipo Windows Forms Application com o nome usandoLINQToSQL (ou algo mais sugestivo);

Nota: Como o objetivo é apenas falar sobre o funcionamento do descritor LINQ To SQL poderíamos ter usado também o Visual Web Developer 2008 Express.

A seguir vamos definir uma conexão com o banco de dados Northwind.mdf se a conexão ainda não existir no seu ambiente faça o seguinte:

1- No menu View e selecione DataBase Explorer e clique com o botão direito do  mouse sobre o item Data Connections e selecione Add Connection...

2- Na janela Add Connection Clique no botão Browse e selecione o banco de dados Northwind.mdf a partir do local onde você o instalou e clique no botão Abrir;

Agora vamos incluir a referência ao LINQ To SQL através do template LINQ To SQL Classes;

No menu Project opção Add New Item selecione na janela Templates o template LINQ to SQL Classes alterando o nome para Northwind.dbml pois iremos efetuar a conexão com o banco de dados Northwind.mdf;

Neste momento será exibida a janela do Descritor Objeto Relacional e você deverá ter a seguinte visão do seu projeto no VB 2008;

Expanda os objetos do banco de dados Northwind.mdf e selecione a tabela Products e a tabela Categories arrastando e soltando na janela Object Relational Designer;

Agora vamos entender o que esta ocorrendo por trás dos panos...

Quando você arrasta e solta as tabelas Categories e Products a partir da janela DataBase Explorer no descritor LINQ To SQL, o VB 2008 irá inspecionar os relacionamentos chave primária/chave estrangeira dos objetos e baseado neles irá criar associações de relacionamentos padrão entre as diferentes classes de entidades criadas.

Nota: As classes de entidades criadas mostram que cada as propriedades de cada classe são mapeadas para as colunas da tabela correspondente no banco de dados. (Product -> Products e Category - Categories)

Para o caso acima o descritor verifica que existe um relacionamento um-para-muitos entre os objetos e isso é expresso pela seta entre a classe Category e a classe Product no descritor. A direção da seta na interface do descritor indica se a associação é um relacionamento do tipo um-para-um ou um-para-muitos.

A classe Category possui um relacionamento um-para-muitos com a classe Product. Isto significa que ela terá uma propriedade Categories que é uma coleção de objetos Produto no interior da categoria. A classe Product possui uma propriedade Category que aponta para a classe Category que representa a categoria a qual o produto pertence.

A associação mostrada acima faz com que a entidade Product possua uma propriedade Category que os desenvolvedores poderão usar para acessar a entidade Category para um dado Produto, e, também faz com que a classe Category possua uma coleção de Produtos que permite aos desenvolvedores retornar todos os produtos para um dada categoria.

O descritor objeto relacional do LINQ To SQL possui também um painel a direita que pode ser usado para criar métodos que interagem com o modelo de banco de dados usando stored procedures e funções. Para ativá-lo clique com o botão direito sobre o descritor e selecione Show Methods Pane . Você terá a seguinte visão:

Para mapear uma stored procedure para a nossa classe DataContext basta arrastar uma stored procedure a partir da janela Database Explorer para o descritor.

Vamos criar uma stored procedure para testar esta funcionalidade. Clique com o botão direito do mouse sobre o objeto Stored Procedures e selecione a opção Add New Stored Procedure. A seguir digite o código abaixo :

A seguir arraste e solte a stored procedure criada no descritor e você verá que ela será mapeada no painel de métodos conforme abaixo:

O nome do método criado na classe DataContext será o mesmo nome dado a stored procedure.

Partir deste momento eu posso usar a sintaxe da LINQ To SQL para invocar o método da stored procedure definida acima para retornar informações dos produtos do banco de dados.

Incluindo um componente DataGridView no formulário e usando o código no evento Load conforme abaixo:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim db As New NorthwindDataContext()

Dim produtos = db.getProdutosPorCategoria(1)

DataGridView1.DataSource = produtos

End Sub

Executando o projeto iremos ter:

Ao arrastarmos a stored procedure para a janela de métodos do descritor o tipo de retorno será informações do produto mas se a operação for feita de forma a arrastar e soltar na classe Product o método irá retornar uma sequência de objetos Product.

Essa mudança no tipo de retorno permite que nossa stored procedure retorne objetos Product fazendo que as alterações feitas nos objetos seja salva no banco de dados pelo LINQ To SQL.

Desta forma podemos usar o código abaixo que altere o preço dos produtos em 50 porcento (50%);

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim db As New NorthwindDataContext()
Dim produtos As New List(Of Product)

produtos = db.getProdutosPorCategoria(1).ToList

For Each p In produtos
       p.UnitPrice = p.UnitPrice * 1.5
Next

db.SubmitChanges()

End Sub

Ao final invocando o método SubmitChanges() irá atualizar de forma transacional todos os preços dos produtos.

Executando o projeto iremos obter:

Pegue o projeto completo aqui :  usandoLINQToSQL2.zip

Aguarde em breve mais artigos sobre LINQ ...


José Carlos Macoratti