Operazioni di query di base (Visual Basic)
In questo argomento viene fornita una breve introduzione alle espressioni LINQ (Language-Integrated Query) in Visual Basic e ad alcune operazioni comuni eseguite in una query. Per ulteriori informazioni, vedere i seguenti argomenti:
Introduzione a LINQ in Visual Basic
Procedura dettagliata: scrittura delle query in Visual Basic
Specifica dell'origine dati (From)
In una query LINQ il primo passaggio consiste nello specificare l'origine dati della query. Di conseguenza, la clausola di From in una query non sempre in primo luogo. Gli operatori di query selezionano ed elaborano il risultato in base al tipo di origine.
Dim query = From cust In customers
' ...
La clausola From specifica l'origine dati, customers, e una variabile di intervallo, cust. La variabile di intervallo è simile a una variabile di iterazione del ciclo, con la differenza che in un'espressione di query non si verifica un'effettiva iterazione. Quando viene eseguita la query, spesso utilizzando un ciclo For Each, la variabile di intervallo funge da riferimento a ogni elemento successivo di customers. Poiché il compilatore è in grado di dedurre il tipo di cust, non è necessario specificarlo in modo esplicito. Per esempi di query scritte con e senza la tipizzazione esplicita, vedere Relazioni tra i tipi nelle operazioni di query (Visual Basic).
Per ulteriori informazioni sull'utilizzo della clausola From in Visual Basic, vedere Clausola From (Visual Basic).
Filtro dei dati (Where)
Probabilmente l'operazione di query più comune consiste nell'applicazione di un filtro sotto forma di espressione booleana. La query restituisce quindi solo gli elementi per i quali l'espressione sia true. Per eseguire l'operazione di filtro viene utilizzata la clausola Where. Il filtro specifica gli elementi presenti nell'origine dati da includere nella sequenza risultante. Nell'esempio seguente vengono inclusi solo i clienti con un indirizzo di Londra.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
È possibile utilizzare gli operatori logici, ad esempio And e Or, per combinare le espressioni di filtro in una clausola Where. Per restituire, ad esempio, solo i clienti di Londra di nome Devon, utilizzare il codice seguente:
Where cust.City = "London" And cust.Name = "Devon"
Per restituire i clienti di Londra o Parigi, utilizzare il codice seguente:
Where cust.City = "London" Or cust.City = "Paris"
Per ulteriori informazioni sull'utilizzo della clausola Where in Visual Basic, vedere Clausola Where (Visual Basic).
Ordinamento dei dati (Order By)
È spesso consigliabile disporre i dati restituiti in un determinato ordine. La clausola Order By consente di ordinare gli elementi presenti nella sequenza restituita in base a uno o più campi specificati. Ad esempio, nella query seguente i risultati vengono ordinati in base alla proprietà Name. Poiché Name è una stringa, i dati restituiti verranno ordinati alfabeticamente, dalla A alla Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Per disporre i risultati in ordine inverso, ovvero dalla Z alla A, utilizzare la clausola Order By...Descending. Se non viene specificato né Ascending né Descending, viene utilizzata l'impostazione predefinita Ascending.
Per ulteriori informazioni sull'utilizzo della clausola Order By in Visual Basic, vedere Clausola Order By (Visual Basic).
Selezione dei dati (Select)
La clausola Select specifica il formato e il contenuto degli elementi restituiti. È possibile, ad esempio, specificare se i risultati devono essere costituiti da oggetti Customer completi, solo da una proprietà Customer, da un sottoinsieme di proprietà, da una combinazione di proprietà di diverse origini dati o da un nuovo tipo di risultati basato su un calcolo. Quando la clausola Select genera un risultato diverso da una copia dell'elemento di origine, l'operazione viene denominata proiezione.
Per recuperare una raccolta costituita da oggetti Customer completi, selezionare la variabile di intervallo stessa:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Se un'istanza Customer è costituita da un oggetto di grandi dimensioni contenente molti campi e si desidera recuperare solo il nome, è possibile selezionare cust.Name, come illustrato nell'esempio seguente. L'inferenza del tipo di variabile locale riconosce che in questo modo il tipo di risultati viene modificato da una raccolta di oggetti Customer in una raccolta di stringhe.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Per selezionare più campi dall'origine dati, sono disponibili due opzioni:
Nella clausola Select specificare i campi da includere nel risultato. Il compilatore definirà un tipo anonimo contenente tali campi come proprietà. Per ulteriori informazioni, vedere Tipi anonimi (Visual Basic).
Poiché gli elementi restituiti nell'esempio seguente sono istanze di un tipo anonimo, non è possibile fare riferimento al tipo in base al nome in altri punti del codice. Il nome definito dal compilatore per il tipo contiene caratteri che non sono validi nel normale codice Visual Basic. Nell'esempio seguente gli elementi presenti nella raccolta restituita dalla query in londonCusts4 sono istanze di un tipo anonimo.
Dim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
In alternativa
Definire un tipo denominato contenente i campi specifici da includere nel risultato e creare e inizializzare le istanze del tipo nella clausola Select. Utilizzare questa opzione solo se è necessario utilizzare i singoli risultati al di fuori della raccolta nella quale sono stati restituiti o se è necessario passarli come parametri nelle chiamate al metodo. Il tipo di londonCusts5 nell'esempio seguente è IEnumerable(Of NamePhone).
Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Per ulteriori informazioni sull'utilizzo della clausola Select in Visual Basic, vedere Clausola Select (Visual Basic).
Creazione di join di dati (Join e Group Join)
È possibile combinare più origini dati nella clausola From in diversi modi. Ad esempio, nel codice seguente vengono utilizzate due origini dati combinando in modo implicito nel risultato le proprietà di entrambe le origini. La query seleziona gli studenti il cui cognome inizia con una vocale.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Nota
È possibile eseguire questo codice con l'elenco di studenti creato in Procedura: creare un elenco di elementi.
La parola chiave Join è equivalente a INNER JOIN in SQL. Le due raccolte vengono combinate in base ai valori chiave corrispondenti tra gli elementi delle due raccolte. La query restituisce tutti o parte degli elementi della raccolta che hanno valori chiave corrispondenti. Ad esempio, nel codice seguente viene duplicata l'azione della precedente operazione di join implicito.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join combina le raccolte in un'unica raccolta gerarchica, in modo analogo a LEFT JOIN in SQL. Per ulteriori informazioni, vedere Clausola Join (Visual Basic) e Clausola Group Join (Visual Basic).
Raggruppamento dei dati (Group By)
È possibile aggiungere una clausola Group By per raggruppare gli elementi nel risultato di una query in base a uno o più campi degli elementi. Ad esempio, nel codice seguente gli studenti vengono raggruppati in base all'anno della classe.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Se si esegue questo codice utilizzando l'elenco di studenti creato in Procedura: creare un elenco di elementi, l'output restituito dall'istruzione For Each sarà:
Year: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Year: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Year: Freshman
Mortensen, Sven
Garcia, Cesar
Nella variante illustrata nel codice seguente vengono ordinati gli anni della classe e vengono quindi ordinati gli studenti all'interno di ogni anno in base al cognome.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Per ulteriori informazioni su Group By, vedere Clausola Group By (Visual Basic).
Vedere anche
Riferimenti
Concetti
Cenni preliminari sugli operatori di query standard
Operazioni di query LINQ di base (C#)