Recursos Visual Basic que suportam LINQ

O nome LINQ (consulta integrada à linguagem) refere-se a nova tecnologia no Visual Basic 2008 que ofereça suporte a consulta, sintaxe e o novo idioma de outro construções diretamente na linguagem. Com LINQ, você não precisa aprender uma nova linguagem de consulta em relação uma fonte de dados externos. É possível consultar dados em bancos de dados relacionais, armazenamentos XML ou objetos usando o Visual Basic. Essa integração dos recursos de consulta para o idioma permite a verificação de tempo de compilação para erros de sintaxe e tipo de segurança. Essa integração também garante que você já saiba mais do que você tem de saber escrever consultas ricos e variadas em Visual Basic 2008.

As seções a seguir descrevem as novas construções de linguagem detalhes suficientes para que você possa começar a ler a documentação introdutória, exemplos de código e aplicativos de exemplo. Você também pode clicar nos links para localizar as explicações mais detalhadas sobre como os recursos de idioma se reúnem para habilitar a consulta integrada à linguagem. Um bom lugar para começar é Demonstra Passo a passo: Escrever consultas em Visual Basic.

Expressões de consulta

Expressões de consulta Visual Basic 2008 pode ser expressa em uma sintaxe declarativa semelhante do SQL ou XQuery. Em tempo de compilação, a sintaxe de consulta é convertida em chamadas de método para a implementação do provedor LINQ dos métodos de extensão de operador de consulta padrão. Controle de aplicativos que os operadores de consulta padrão estão no escopo, especificando o namespace apropriado com um Imports instrução. Sintaxe de uma expressão de consulta Visual Basic tem esta aparência:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Para obter mais informações, consulte Introdução ao LINQ no Visual Basic.

Variáveis digitadas implicitamente

Em vez de especificar explicitamente um tipo ao declarar e inicializar uma variável, você pode habilitar o compilador inferir e atribuir o tipo, conforme mostrado no exemplo a seguir. Isso é conhecido como inferência de tipo local.

ObservaçãoObservação

Inferência de tipo local funciona somente quando você está definindo uma variável local dentro de um corpo de método com Option Infer definido como On. Oné o padrão para novos projetos no LINQ. Para obter mais informações, consulte Declaração Option Infer.

' The variable number will be typed as an integer.
Dim aNumber = 5

' The variable name will be typed as a String.
Dim aName = "Virginia"
ObservaçãoObservação

No Visual Basic 2005 e versões anteriores, esses exemplos de compilação, mas o tipo atribuído a ambos aNumber e aName é Object. Portanto, um projeto existente é recompilado no Visual Basic 2008, com Option Infer definido como On, podem se comportar de forma diferente do que em versões anteriores do idioma.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

Variáveis declaradas dessa maneira são fortemente tipadas, como as variáveis cujo tipo você especificar explicitamente. Inferência de tipo local torna possível criar tipos anônimos, que são necessários para consultas LINQ, mas ele pode ser usado para qualquer variável local.

Para obter mais informações, consulte Inferência de tipo de variável local (Visual Basic).

Inicializadores de Objeto

Inicializadores de objeto são usados em expressões de consulta quando você precisa criar um tipo anônimo para manter os resultados de uma consulta. Eles também podem ser usados para inicializar objetos de tipos nomeados fora das consultas. Usando um inicializador de objeto, você pode inicializar um objeto em uma única linha sem explicitamente chamar um construtor. Supondo que você tenha uma classe chamada Customer que tem públicas Name e Phone Propriedades, junto com outras propriedades, pode ser usado um inicializador de objeto desta maneira:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Para obter mais informações, consulte Inicializadores de objeto: Tipos nomeados e anônimos (Visual Basic).

Tipos Anônimos

Tipos anônimos fornecem uma maneira conveniente de temporariamente um conjunto de propriedades de grupo em um elemento que você deseja incluir no resultado da consulta. Isso permite que você escolher qualquer combinação de campos disponíveis na consulta, em qualquer ordem, sem definir um tipo de dados nomeado para o elemento.

Um tipo anônimo foi construído dinamicamente pelo compilador. O nome do tipo é atribuído pelo compilador e pode alterar com cada nova compilação. Portanto, o nome não pode ser usado diretamente. Tipos anônimos são inicializados da seguinte maneira:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Para obter mais informações, consulte Tipos anônimos (Visual Basic).

Métodos de extensão

Métodos de extensão permitem que você adicione métodos para um tipo de dados ou a interface de fora da definição. Este recurso permite que você, na verdade, adicionar novos métodos para um tipo existente sem realmente modificar o tipo. Os operadores de consulta padrão são um conjunto de métodos de extensão que fornecem LINQ a funcionalidade de consulta para qualquer tipo que implementa IEnumerable<T>. Outras extensões para IEnumerable<T> incluem Count, Union, e Intersect.

O método de extensão a seguir adiciona um método de impressão para o String classe.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
    Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

O método é chamado como um método de instância comum de String:

Dim greeting As String = "Hello"
greeting.Print()

Para obter mais informações, consulte Métodos de extensão (Visual Basic).

Expressões Lambda

Uma expressão lambda é uma função sem um nome que calcula e retorna um único valor. Ao contrário das funções nomeadas, uma expressão lambda pode ser definida e executada ao mesmo tempo. O exemplo a seguir exibe a 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Você pode atribuir a definição da expressão lambda para um nome de variável e use o nome para chamar a função. O exemplo a seguir exibe também os 4.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

Em LINQ, expressões lambda são a base de muitos dos operadores de consulta padrão. O compilador cria expressões lambda para capturar os cálculos que são definidos nos métodos de consulta fundamentais, como Where, Select, Order By, Take Whilee outros.

Por exemplo, o código a seguir define uma consulta que retorna todos os alunos sênior em uma lista dos alunos.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

A definição da consulta é compilada no código que é semelhante ao exemplo a seguir, que usa duas expressões lambda para especificar os argumentos para Where e Select.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Tanto a versão pode ser executada usando um For Each loop:

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Para obter mais informações, consulte Expressões Lambda (Visual Basic).

Consulte também

Conceitos

LINQ e seqüências de caracteres

C# recursos que oferecem suporte ao LINQ

Outros recursos

LINQ (consulta integrada à linguagem)

Guia de Introdução do LINQ em Visual Basic