Compartilhar via


Recursos do Visual Basic que suportam LINQ

O nome Language-Integrated Query (LINQ) refere-se à tecnologia no Visual Basic que dá suporte à sintaxe de consulta e outros constructos de idioma diretamente no idioma. Com o LINQ, você não precisa aprender uma nova linguagem a consultar em 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 ao idioma 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 avançadas e variadas no Visual Basic.

As seções a seguir descrevem os constructos de linguagem que dão suporte ao LINQ em detalhes suficientes para permitir que você comece a ler a documentação introdutória, os exemplos de código e os aplicativos de exemplo. Você também pode clicar nos links para encontrar explicações mais detalhadas de como os recursos de linguagem se reúnem para habilitar a consulta integrada ao idioma. Um bom lugar para começar é passo a passo: escrever 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. No tempo de compilação, a sintaxe de consulta é convertida em chamadas de método para uma implementação LINQ dos métodos de extensão do operador de consulta padrão do provedor. Os aplicativos controlam os operadores de consulta padrão que estão no escopo, especificando o namespace apropriado com uma diretiva Imports. 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, confira Introdução a LINQ em Visual Basic.

Variáveis tipadas implicitamente

Em vez de especificar explicitamente um tipo ao declarar e inicializar uma variável, você pode usar o compilador para inferir e atribuir o tipo. Isso é chamado de inferência de tipo local.

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

O exemplo a seguir ilustra a inferência de tipo local. Para usar este exemplo, você deve definir Option Infer para 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 possibilita a criação de tipos anônimos, que são descritos posteriormente 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 OnOff. Ocorre um erro de tempo de compilação 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

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 chamar explicitamente um construtor. Supondo que você tenha uma classe nomeada Customer que tenha propriedades públicas e Name públicasPhone, juntamente com outras propriedades, um inicializador de objeto pode ser usado dessa 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 ser alterado 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.

Métodos de Extensão

Os métodos de extensão permitem adicionar métodos a um tipo de dados ou interface de fora da definição. Esse recurso permite que você, na verdade, "adicione" novos métodos a tipos existentes sem realmente modificá-los. Os operadores de consulta padrão são um conjunto de métodos de extensão que fornecem a funcionalidade de consulta LINQ para qualquer tipo que implementa IEnumerable<T>. Outras extensões a IEnumerable<T> serem incluídas Count, Unione 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 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 sã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 While e outros.

Por exemplo, o código a seguir define uma consulta que retorna todos os alunos do último ano 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 Lambda.

Confira também