LINQ - Usando os operadores TAKE e SKIP


Em meu artigo -   LINQ - Operadores padrão de consultas - eu apresentei a relação dos operadores padrão de consultas disponíveis para utilização no LINQ.


Se você acessar o artigo irá notar que são muitos operadores e as possibilidades são imensas. Como não dá para apresentar todos os operadores em um artigo irei abordando aqueles que julgo mais interessantes. (aceito sugestões).
 

Nota: No sítio http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx você tem uma relação dos operadores com exemplos sobre cada um deles.

Vou apresentar neste artigo os operadores : TAKE e SKIP .

Para acompanhar os exemplos deste artigo você deverá ter instalado o Visual Basic 2008 Express Edition.

Se não tiver pegue aqui: Visual Basic 2008 Express Edition

1-  Usando o operador Take e TakeWhile

Abra o VS 2008 Express e crie um novo projeto do tipo Windows Forms Application com o nome linq_Take_LET_SKIP;

No formulário padrão inclua um ListBox e um Button e a seguir no evento Click do Button inclua o seguinte código:

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

 

Dim numeros As Integer() = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}

 

Dim resultado = From num In numeros.Take(5)

 

ListBox1.Items.Add("TAKE: Pegando os 5 primeiros numeros: ")

 

For Each n In resultado

    ListBox1.Items.Add(n)

Next

End Sub

O operador Take é usado para selecionar os primeiros n objetos de uma coleção.

2-  Usando o operador Skip

Inclua um novo botão de comando no projeto e no seu evento Click digite o código a seguir:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

 

Dim numeros As Integer() = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}

 

Dim resultado = From num In numeros.Take(5) _

                         Skip 2

 

ListBox1.Items.Add("Skip(2): Os 5 primeiros n£meros a partir do terceiro ")

 

For Each n In resultado

    ListBox1.Items.Add(n)

Next

End Sub

O operador Skip ignora o(s) primeiro(s) n objetos de uma coleção.

Se alterarmos a sentença LINQ para : 

Dim resultado = From num In numeros.Skip(2) _

                         Take 5

iremos obter:

 

 

Neste caso os dois primeiros elementos serão ignorados (Skip(2)) e serão exibidos os próximos 5 elementos.

A seguir vamos mostrar um exemplo mais prático usando os operadores Take e Skip.

Crie um novo projeto no Visual Studio 2008 Express com o nome linq_paginacao;

A seguir 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 (você pode usar qualquer nome);

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...

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;

Neste momento será exibida a janela do descritor Objeto Relacional. Expanda os objetos do banco de dados Northwind.mdf e selecione a tabela Customers arrastando e soltando na janela Object Relational Designer;

A tabela Customers do banco de dados será mapeada como uma classe (campos como propriedades, procedures e funções como métodos)  e você terá no Descritor a classe que representa os objetos do banco de dados; Cada propriedade definida no objeto Customer esta mapeada para cada coluna da tabela Customers.

O arquivo Northwind.dbml contém o arquivo XML com informações sobre o leiaute das tabelas que foram mapeadas e também o descritor contendo as classes geradas pelo mapeamento. Após encerrar o mapeamento você já terá acesso aos recursos do LINQ To SQL com direito a intellisense completo das informações referente as tabelas mesmo sem conhecer nada sobre elas.

Se você observar as propriedades do DataContext gerado irá perceber que o nome dado ao contexto é NorthwindDataContext e verá também a conexão com o banco de dados Northwind.mdf

O Banco de dados é mapeado em um objeto DataContext permitindo acesso a tabelas de forma transparente sem termos que nos preocupar com conexão. Teremos que apenas usar os recursos do LINQ To SQL.

O DataContext é o responsável por gerar as instruções SQL da sua linguagem de consulta e então mapear as linhas de dados retornadas a partir do seu banco de dados para objetos.

A seguir inclua um controle DataGridView e um controle Button o formulário padrão form1.vb conforme o leiaute abaixo:

Digite a seguinte linha de código no início da classe Form:

Dim db As New NorthwindDataContext

No evento Click do botão inclua o código a seguir:

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

 

Dim cli = From clientes In db.Customers _

              Select clientes.ContactName, clientes.CustomerID, clientes.City, clientes.Country _

              Order By ContactName _

              Skip 10 _

              Take 10

 

DataGridView1.DataSource = cli

 

End Sub

Executando o projeto iremos obter:

A instrução LINQ selecionou os  campos ContactName, CustomerID, City e Country da tabela Customers ignorando os 10 primeiros registros e obtendo os próximos 10 registros apenas.

Podemos melhorar ainda mais criando uma rotina chamada getClientesPagina que será usada para navegar pelos registros conforme o código abaixo:

Public Function GetClientesPagina(ByVal db As NorthwindDataContext, _

                                                 ByVal numPagina As Integer, _

                                                 ByVal tamPagina As Integer) As IEnumerable

 

                          Return From clientes In db.Customers _

                         Select clientes.ContactName, clientes.CustomerID, clientes.City, clientes.Country _

                         Skip (numPagina - 1) * tamPagina _

                         Take tamPagina

End Function

Para usar a rotina podemos incluir um novo botão de comando e fazer a chamada no evento Click do mesmo conforme o código a seguir:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

DataGridView1.DataSource = GetClientesPagina(db, 3, 10)

End Sub

O resultado obtido na execução do código pode ser visto abaixo:

Os operadores Take e Skip recursos de seleção de informações que podem ser usados em alguns casos para efetuar uma navegação estática e uma paginação dinâmica.

Veja no meu artigo como criar uma paginação dinâmica com ASP. NET usando os operadores LINQ take e Skip:  ASP .NET - Paginação com LINQ

Pegue o projeto completo aqui :  Linq_Take_SKIP.zip  e linq_Paginacao.zip

Eu sei é apenas LINQ , mas eu gosto...


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

Referências:


José Carlos Macoratti