Partilhar via


Recursos do Visual Basic que suportam LINQ

O nome Language-Integrated Query (LINQ) refere-se à tecnologia no Visual Basic que suporta sintaxe de consulta e outras construções de linguagem diretamente na linguagem. Com o LINQ, você não precisa aprender um novo idioma para consultar uma fonte de dados externa. Você pode consultar dados em bancos de dados relacionais, repositórios XML ou objetos usando o Visual Basic. Essa integração de recursos de consulta na linguagem permite a verificação em tempo de compilação de erros de sintaxe e segurança de tipo. Essa integração também garante que você já saiba a maior parte do que precisa saber para escrever consultas ricas e variadas no Visual Basic.

As seções a seguir descrevem as construções de linguagem que suportam LINQ com detalhes suficientes para permitir que você comece a ler a documentação introdutória, exemplos de código e aplicativos de exemplo. Você também pode clicar nos links para encontrar explicações mais detalhadas de como os recursos de idioma se unem para habilitar a consulta integrada ao idioma. Um bom lugar para começar é Passo a passo: Escrevendo consultas no Visual Basic.

Expressões de consulta

Expressões de consulta no Visual Basic podem ser expressas em uma sintaxe declarativa semelhante à de SQL ou XQuery. Em tempo de compilação, a sintaxe de consulta é convertida em chamadas de método para a implementação de um provedor LINQ dos métodos de extensão de operador de consulta padrão. Os aplicativos controlam quais operadores de consulta padrão estão no escopo especificando o namespace apropriado com uma Imports instrução. A sintaxe de uma expressão de consulta do 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 quando você declara e inicializa uma variável, você pode habilitar o compilador para inferir e atribuir o tipo. Isso é conhecido como inferência de tipo local.

As variáveis cujos tipos são inferidos são fortemente tipadas, assim como as variáveis cujo tipo você especifica explicitamente. A inferência de tipo local funciona somente quando você está definindo uma variável local dentro de um corpo de método. Para obter mais informações, consulte Instrução de inferência de opção e Inferência de tipo local.

O exemplo a seguir ilustra a inferência de tipo local. Para usar este exemplo, você deve definir Option Infer como On.

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

' The variable aName will be typed as a String.
Dim aName = "Virginia"

A inferência de tipo local também torna possível criar tipos anônimos, que são descritos mais adiante nesta seção e são necessários para consultas LINQ.

No exemplo LINQ a seguir, a inferência de tipo ocorre se Option Infer for ou OffOn . Um erro em tempo de compilação ocorre se Option Infer for Off e Option Strict for On.

' 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

Inicializadores de objeto

Os inicializadores de objeto são usados em expressões de consulta quando você precisa criar um tipo anônimo para armazenar 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 chamar explicitamente um construtor. Supondo que você tenha uma classe nomeada Customer que tenha public Name e Phone propriedades, juntamente com outras propriedades, um inicializador de objeto pode ser usado 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.

Tipos Anônimos

Os tipos anônimos fornecem uma maneira conveniente de agrupar temporariamente um conjunto de propriedades em um elemento que você deseja incluir em um resultado de consulta. Isso permite que você escolha 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 é construído dinamicamente pelo compilador. O nome do tipo é atribuído pelo compilador e pode mudar a cada nova compilação. Portanto, o nome não pode ser usado diretamente. Os 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.

Métodos da Extensão

Os métodos de extensão permitem que você adicione métodos a um tipo de dados ou interface de fora da definição. Esse recurso permite que você possa, de fato, adicionar novos métodos a um tipo existente sem realmente modificar o tipo. Os operadores de consulta padrão são eles próprios um conjunto de métodos de extensão que fornecem funcionalidade de consulta LINQ para qualquer tipo que implemente IEnumerable<T>o . Outras extensões para IEnumerable<T> incluir Count, Union, e Intersect.

O método de extensão a seguir adiciona um método de impressã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.

Expressões do 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 4.

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

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

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

No LINQ, as expressões lambda estão subjacentes a muitos dos operadores de consulta padrão. O compilador cria expressões lambda para capturar os cálculos definidos em 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 seniores de uma lista de alunos.

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

A definição de consulta é compilada em código 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)

Qualquer 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 do Lambda.

Consulte também