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 NorthwindDataContextNo 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
NET - LINQ a seu dispor - Sintaxe e Operadores - Macoratti ...