Share via


Funzionalità di Visual Basic che supportano LINQ

Aggiornamento: novembre 2007

Il nome LINQ (Language-Integrated Query) si riferisce alla nuova tecnologia in Visual Basic 2008 che supporta la sintassi della query e gli altri nuovi 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 2008.

Nelle sezioni seguenti vengono illustrati dettagliatamente i nuovi costrutti di linguaggio 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 2008 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 Introduzione a LINQ in Visual Basic.

Variabili tipizzate in modo implicito

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

Nota:

L'inferenza del tipo di variabile locale funziona solo quando si definisce una variabile locale all'interno del corpo di un metodo, con Option Infer impostato su On. On rappresenta l'impostazione predefinita per i nuovi progetti in LINQ. Per ulteriori informazioni, vedere Istruzione 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"
Nota:

In Visual Basic 2005 e nelle versioni precedenti questi esempi vengono compilati, ma il tipo assegnato a aNumber e aName è Object. Pertanto, un progetto esistente ricompilato in Visual Basic 2008, con Option Infer impostato su On, può avere un comportamento diverso rispetto alle versioni precedenti del linguaggio.

' 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

Le variabili dichiarate in questo modo sono fortemente tipizzate, esattamente come le variabili in cui il tipo viene specificato in modo esplicito. L'inferenza del tipo di variabile locale consente di creare tipi anonimi, necessari per le query LINQ, ma può essere utilizzata per qualsiasi variabile locale.

Per ulteriori informazioni, vedere Inferenza dei tipi locali.

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 As Customer = New Customer With {.Name = "Mike", _
                                           .Phone = "555-0212"}

Per ulteriori informazioni, vedere Inizializzatori di oggetto: tipi denominati e tipi anonimi.

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 Tipi anonimi.

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 di 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 Espressioni lambda.

Vedere anche

Attività

Sample Queries (Visual Basic)

Concetti

LINQ e stringhe

Altre risorse

LINQ (Language-Integrated Query)

Introduzione a LINQ in Visual Basic