Condividi tramite


Funzionalità di Visual Basic che supportano LINQ

Il nome LINQ (Language-Integrated Query) si riferisce alla tecnologia in Visual Basic che supporta la sintassi della query e gli altri costrutti di linguaggio direttamente nel linguaggio. Con LINQ non è necessario imparare un nuovo linguaggio per eseguire una query su un'origine dati esterna. È possibile eseguire una query sui dati presenti in database relazionali, archivi XML o oggetti utilizzando Visual Basic. Questa integrazione delle funzionalità di query nel linguaggio consente il controllo degli errori di sintassi e dell'indipendenza dai tipi in fase di compilazione. Questa integrazione fornisce inoltre tutte le informazioni necessarie per poter scrivere query complesse in Visual Basic.

Nelle sezioni seguenti vengono illustrati dettagliatamente i costrutti di linguaggio che supportano LINQ per poter iniziare a leggere la documentazione introduttiva, gli esempi di codice e le applicazioni di esempio. È inoltre possibile fare clic sui collegamenti per spiegazioni più dettagliate sulle funzionalità del linguaggio per consentire l'utilizzo di Language Integrated Query. Si consiglia di iniziare da Procedura dettagliata: scrittura delle query in Visual Basic.

Espressioni di query

Le espressioni di query in Visual Basic possono essere definite in una sintassi dichiarativa simile a quella di SQL o XQuery. In fase di compilazione la sintassi della query viene convertita nelle chiamate al metodo per l'implementazione di un provider LINQ dei metodi di estensione degli operatori di query standard. Le applicazioni controllano gli operatori di query standard inclusi nell'ambito specificando lo spazio dei nomi adatto con un'istruzione Imports. Di seguito è riportato un esempio della sintassi per un'espressione di query Visual Basic:

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

Per ulteriori informazioni, vedere Introduction to LINQ in Visual Basic.

Variabili tipizzate in modo implicito

Anziché specificare in modo esplicito un tipo quando si dichiara e inizializza una variabile, è possibile consentire al compilatore di dedurre e assegnare il tipo. Questo processo viene definito inferenza del tipo di variabile locale.

Le variabili il cui tipo viene dedotto sono fortemente tipizzate, esattamente come le variabili in cui il tipo viene specificato in modo esplicito. L'inferenza del tipo di variabile locale funziona solo quando si definisce una variabile locale all'interno del corpo di un metodo. Per ulteriori informazioni, vedere Istruzione Option Infer e Local Type Inference.

Nell'esempio seguente viene illustrata l'inferenza del tipo di variabile locale. Per utilizzare questo esempio, è necessario impostare Option Infer su On.

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

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

L'inferenza del tipo di variabile locale consente inoltre di creare i tipi anonimi necessari per le query LINQ. Tali tipi vengono descritti più avanti in questo argomento.

Nell'esempio di LINQ seguente l'inferenza del tipo si verifica se Option Infer è On o Off. Se Option Infer è Off e Option Strict è On si verifica un errore in fase di compilazione.

' 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

Inizializzatori di oggetto

Gli inizializzatori di oggetto vengono utilizzati nelle espressioni di query quando è necessario creare un tipo anonimo per contenere i risultati di una query. Possono inoltre essere utilizzati per inizializzare oggetti di tipi denominati all'esterno delle query. Utilizzando un inizializzatore di oggetto, è possibile inizializzare un oggetto in una sola riga senza una chiamata esplicita a un costruttore. Se si dispone di una classe denominata Customer con le proprietà pubbliche Name e Phone, insieme alle altre proprietà, l'inizializzatore di oggetto può essere utilizzato in questo modo:

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

Per ulteriori informazioni, vedere Object Initializers: Named and Anonymous Types.

Tipi anonimi

I tipi anonimi costituiscono una valida soluzione per raggruppare temporaneamente un insieme di proprietà in un elemento che si desidera includere nel risultato di una query. In questo modo è possibile scegliere qualsiasi combinazione di campi disponibili nella query, in qualsiasi ordine, senza definire un tipo di dati denominato per l'elemento.

Un tipo anonimo viene costruito dinamicamente dal compilatore. Il nome del tipo viene assegnato dal compilatore e può cambiare a ogni nuova compilazione. Pertanto, il nome non può essere utilizzato direttamente. I tipi anonimi vengono inizializzati nel modo seguente:

' 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

Per ulteriori informazioni, vedere Anonymous Types.

Metodi di estensione

I metodi di estensione consentono di aggiungere metodi a un tipo di dati o a un'interfaccia all'esterno della definizione. Questa funzionalità consente in pratica di aggiungere nuovi metodi a un tipo esistente senza dovere effettivamente modificare il tipo. Gli operatori query standard costituiscono un insieme di metodi di estensione che forniscono le funzionalità delle query LINQ per qualsiasi tipo che implementi IEnumerable<T>. Altre estensioni a IEnumerable<T> includono Count, Union e Intersect.

Il metodo di estensione seguente aggiunge un metodo di stampa alla classe String.

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

Il metodo viene chiamato come metodo di istanza comune di String:

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

Per ulteriori informazioni, vedere Metodi di estensione (Visual Basic).

Espressioni lambda

Una espressione lambda è una funzione senza nome, che calcola e restituisce un singolo valore. A differenza delle funzioni denominate, un'espressione lambda può essere definita ed eseguita contemporaneamente. Nell'esempio seguente viene visualizzato 4.

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

È possibile assegnare la definizione dell'espressione lambda a un nome di variabile e utilizzare quindi il nome per chiamare la funzione. Anche nell'esempio seguente viene visualizzato 4.

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

In LINQ molti degli operatori di query standard hanno espressioni lambda sottostanti. Il compilatore crea le espressioni lambda per acquisire i calcoli definiti nei metodi di query fondamentali, ad esempio Where, Select,Order By, Take While e altri.

Ad esempio, nel codice seguente viene definita una query che restituisce tutti gli studenti senior da un elenco di studenti.

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

La definizione della query viene compilata nel codice simile all'esempio seguente che utilizza due espressioni lambda per specificare gli argomenti per Where e Select.

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

Entrambe le versioni possono essere eseguite utilizzando un ciclo For Each:

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

Per ulteriori informazioni, vedere Lambda Expressions.

Vedere anche

Riferimenti

Istruzione Option Infer

Istruzione Option Strict

Concetti

LINQ e stringhe

Funzionalità di C# che supportano LINQ

Altre risorse

LINQ (Language-Integrated Query)

Introduzione a LINQ in Visual Basic

Cronologia delle modifiche

Data

Cronologia

Motivo

Maggio 2011

Modifica della sezione "Variabili tipizzate in modo implicito".

Correzione di bug nel contenuto.