Condividi tramite


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

Query (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

IEnumerable

Concetti

Cenni preliminari sugli operatori di query standard

Operazioni di query LINQ di base (C#)

Altre risorse

Introduzione a LINQ in Visual Basic

Query (Visual Basic)

LINQ in Visual Basic