.NET

7 jan, 2010

ASP .NET – Preenchendo um DropDownList com LINQ to SQL

Publicidade

A partir da versão 3.5 da
plataforma .NET o Visual Studio trouxe integrado o LINQ como uma
nova ferramenta para trabalhar com a camada de dados em
aplicações que usam a linguagem VB.NET ou C#. Antes do LINQ,
geralmente era criada uma camada de acesso a dados com a
utilização dos objetos SqlConnection, SqlCommand, DataReader,
DataSet, etc para manipular os dados.

Com o advento do LINQ e do LINQ to
SQL não precisamos nos preocupar com detalhes relacionados aos
objetos SqlConnection, SqlCommand, DataReader e DataSet, pois
podemos usar os objetos de negócios gerados pelo LINQ e a camada
de acesso a dados.

Por ser uma tecnologia recente, ainda
estamos aprendendo a melhor forma de usar o recurso oferecido
pelo LINQ e o LINQ to SQL em nossas aplicações, e este artigo
tem o objetivo de mostrar como você pode preencher um controle dropdownlist em uma aplicação ASP .NET usando o LINQ to SQL.

Portanto eu vou mostrar duas das formas
mais usadas de preencher o controle Dropdownlist em um web site
ASP .NET. Usaremos o Visual Web Developer 2008 Express
Edition e o SQL Server 2005 Express Edition e o banco de dados
Northwind.mdf.

Vamos lá.

Abra o Visual Web Developer
2008 Express e crie
um novo web site no menu File->New Web Site, usando o template ASP .NET Web Site e a linguagem Visual Basic, com o nome
DropDownList_LINQ;

Selecione o projeto e clique com o
botão direito do mouse sobre o nome e selecione Add -> New
Item;

A seguir selecione o template LINQ
to SQL Classes e informe o nome Northwind.dbml, pois vamos usar o
banco de dados Northwind.mdf;

O arquivo .dbml será copiado para a
pasta AppCode e o assistente LINQ será aberto.

A seguir abra a janela DataBase
Explorer e selecione a conexão com o banco de dados Northwind.mdf (se ela não existir você deverá criá-la).
Expanda os objetos Table e arraste e solte a tabela Products
no descrito LINQ para gerar o mapeamento OR/M e criar a entidade Product
e contexto NorthwindDataContext para gerenciar o
relacionamento entre a entidade e a tabela usada no exemplo
conforme a figura abaixo:

Com isso já temos o ambiente
preparado para acessar os dados a partir do LINQ to SQL.

1.
Preenchendo um dropdownlist com o LinqDataSource

Usar o controle para preencher o
controle dropdownlist é uma das maneiras mais simples.

Selecione e abra a página
Default.aspx e inclua uma tabela a partir do menu Table->
Insert Table;

A seguir inclua um controle
DropDownList na página e a partir da guia Data arraste e solte
um controle LinqDataSource conforme o leiaute abaixo:

Vamos configurar o componente
LinqDataSource. Selecione o componente e clique em Configure DataSource;

Na janela do assistente você verá
o contexto NorthwindDataContext sendo exibido, clique em Next>;

Na próxima janela selecione a
tabela Products e marque os campos que vamos usar: ProductID e
ProductName e clique em Finish;

Agora selecione o controle
Dropdownlist e defina as seguintes propriedades:

  • ID = ddl1 – o nome do controle;
  • DataSourceID – LinqDataSource1
    – a fonte de dados do controle;
  • DataTextField – ProductName – o
    campo que será exibido no controle;
  • DataValueField – ProductID – o
    valor que será tratado quando um item for selecionado no
    controle;

Executando o web site iremos obter:

Esta é a forma mais fácil de fazer
a vinculação com o dropdownlist, não usa nenhum código e é
fácil de entender e de manter, mas nem sempre o que é o mais
fácil é o mais correto, e dependendo da arquitetura do seu
projeto, efetuar a vinculação direta usando o controle
LinqDataSource com a fonte de dados viola a hierarquia de uma
arquitetura em camadas e não lhe oferece nenhum objeto com o
qual você possa trabalhar usando padrões de projeto.

2.
Preenchendo um dropdownlist com vinculação a objetos LINQ

Vamos agora mostrar uma outra forma
de preencher o dropdownlist usando objetos LINQ através da
vinculação direta.

Inclua um novo controle DropDowList
na página e defina as seguintes propriedades:

  • ID = ddl2 – o nome do controle;
  • DataTextField – ProductName – o
    campo que será exibido no controle;
  • DataValueField – ProductID – o
    valor que será tratado quando um item for selecionado no
    controle;

Agora no evento Load da página
inclua o código abaixo:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' Vinculando diretamente com a entidade LINQ
ddl2.DataSource = GetProdutos()
ddl2.DataBind()
End If
End Sub

Agora defina o método estático GetProdutos
conforme abaixo:

  Public Shared Function GetProdutos() As List(Of Product)
'Usamos o contexto criado pelo LINQ to SQL
Using contexto As New NorthwindDataContext()
Return (contexto.Products.ToList())
End Using
End Function

Usando este método tivemos que
escrever um pouco de código. O ideal seria ter criado uma camada
separada para definir os objetos LINQ através da criação de um
novo projeto do tipo Class Library e em seguida referenciar o
projeto ao nosso web site.

A função GetProdutos() acessa
através do contexto criado pelo LINQ a tabela Products; chamamos
o método ToList() para retornar uma coleção de objetos.

Executando o web site teremos o
seguinte resultado:

Neste método temos um controle
maior sobre como os dados podem ser exibidos, pois podemos alterar
o método GetProdutos() incluindo algum processamento prévio.
Além disso, dessa forma podemos trabalhar com uma arquitetura em
camadas. O problema é que estamos fazendo a vinculação
diretamente com os objetos LINQ e o nosso código não fica tão
fácil de ser reusado.

Existe ainda uma outra forma de
fazer esta vinculação através da definição de uma interface
para os tipos que estamos tratando e da implementação desta
interface e da utilização de Reflection, mas abordarei este
método em outro artigo.

Aguarde mais artigos sobre ADO .NET.