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 alcuni dei tipi tipici di operazioni eseguite in una query. Per altre informazioni, vedere gli argomenti seguenti:

Introduzione a LINQ in Visual Basic

Query

Procedura dettagliata: Scrittura di query in Visual Basic

Specificare l'origine dei dati (da)

In una query LINQ il primo passaggio consiste nel specificare l'origine dati su cui eseguire la query. Pertanto, la From clausola in una query viene sempre fornita per prima. Gli operatori di query selezionano e modellano il risultato in base al tipo dell'origine.

Dim query = From cust In customers
'           ...

La From clausola specifica l'origine dati, customerse una variabile di intervallo, cust. La variabile di intervallo è simile a una variabile di iterazione del ciclo, ad eccezione del fatto che in un'espressione di query non si verifica alcuna iterazione effettiva. Quando la query viene eseguita, spesso usando un For Each ciclo, la variabile di intervallo funge da riferimento a ogni elemento successivo in customers. Poiché il compilatore può dedurre il tipo di cust, non è necessario specificarlo in modo esplicito. Per esempi di query scritte con e senza tipizzazione esplicita, vedere Relazioni tra tipi nelle operazioni di query (Visual Basic).For examples of queries written with and without explicit typing, see Type Relationships in Query Operations (Visual Basic).

Per altre informazioni su come usare la From clausola in Visual Basic, vedere Clausola From.

Filtraggio dei dati (Where)

Probabilmente l'operazione di query più comune consiste nell'applicare un filtro sotto forma di espressione booleana. La query quindi restituisce solo gli elementi per i quali l'espressione è vera. Una Where clausola viene utilizzata per eseguire il filtro. Il filtro specifica gli elementi nell'origine dati da includere nella sequenza risultante. Nell'esempio seguente vengono inclusi solo i clienti che hanno un indirizzo a Londra.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

È possibile usare operatori logici come And e Or per combinare espressioni di filtro in una Where clausola . Ad esempio, per restituire solo i clienti che provengono da Londra e il cui nome è Devon, usare il codice seguente:

Where cust.City = "London" And cust.Name = "Devon"

Per restituire i clienti da Londra o Parigi, usare il codice seguente:

Where cust.City = "London" Or cust.City = "Paris"

Per altre informazioni su come usare la Where clausola in Visual Basic, vedere Clausola Where.

Ordinamento dei dati (Order By)

Spesso è utile ordinare i dati restituiti in un ordine specifico. La Order By clausola causerà l'ordinamento degli elementi nella sequenza restituita in base a un campo o a campi specificati. Ad esempio, la query seguente ordina i risultati in base alla Name proprietà . Poiché Name è una stringa, i dati restituiti verranno ordinati alfabeticamente, da A a Z.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

Per ordinare i risultati in ordine inverso, da Z a A, usare la Order By...Descending clausola . Il valore predefinito è Ascending quando né Ascending viene specificato né Descending .

Per altre informazioni su come usare la Order By clausola in Visual Basic, vedere Clausola Order By.

Selezione di dati (Seleziona)

La Select clausola specifica il formato e il contenuto degli elementi restituiti. Ad esempio, è possibile specificare se i risultati saranno costituiti da oggetti completi Customer , da una Customer sola proprietà, da un subset di proprietà, da varie origini dati o da un nuovo tipo di risultato basato su un calcolo. Quando la Select clausola produce qualcosa di diverso da una copia dell'elemento di origine, l'operazione viene chiamata proiezione.

Per recuperare una raccolta costituita da oggetti completi Customer , 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 è un oggetto di grandi dimensioni con molti campi e tutto ciò che si desidera recuperare è il nome, è possibile selezionare cust.Name, come illustrato nell'esempio seguente. L'inferenza del tipo locale riconosce che questo modifica il tipo di risultato da una raccolta di Customer oggetti a 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:

  • Select Nella clausola specificare i campi da includere nel risultato. Il compilatore definirà un tipo anonimo con tali campi come proprietà. Per altre informazioni, vedere Tipi anonimi.

    Poiché gli elementi restituiti nell'esempio seguente sono istanze di un tipo anonimo, non è possibile fare riferimento al tipo in base al nome altrove nel codice. Il nome designato dal compilatore per il tipo contiene caratteri non validi nel normale codice di Visual Basic. Nell'esempio seguente gli elementi della raccolta restituiti 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
    

    oppure

  • Definire un tipo denominato contenente i campi specifici da includere nel risultato e creare e inizializzare istanze del tipo nella Select clausola . Utilizzare questa opzione solo se è necessario utilizzare singoli risultati all'esterno della raccolta in cui vengono 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 altre informazioni su come usare la Select clausola in Visual Basic, vedere Clausola Select.

Unione di dati (join e join di gruppo)

È possibile combinare più origini dati nella From clausola in diversi modi. Ad esempio, il codice seguente usa due origini dati e combina in modo implicito le proprietà di entrambi nel risultato. 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

Annotazioni

È possibile eseguire questo codice con l'elenco di studenti creati in Procedura: Creare un elenco di elementi.

La Join parola chiave è equivalente a in INNER JOIN SQL. Combina due raccolte in base ai valori chiave corrispondenti tra gli elementi nelle due raccolte. La query restituisce tutti o parte degli elementi della raccolta con valori di chiave corrispondenti. Ad esempio, il codice seguente duplica l'azione del join implicito precedente.

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 una singola raccolta gerarchica, proprio come in LEFT JOIN SQL. Per altre informazioni, vedere Clausola Join e Clausola Group Join.

Raggruppamento di dati (raggruppa per)

È possibile aggiungere una Group By clausola per raggruppare gli elementi in un risultato della query in base a uno o più campi degli elementi. Ad esempio, il codice seguente raggruppa gli studenti per anno di 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 esegui questo codice usando l'elenco di studenti creato in Procedura: Creare un elenco di elementi, l'output dell'istruzione For Each è:

Anno: Junior

Tucker, Michael

Garcia, Hugo

Garcia, Debra

Tucker, Lance

Anno: Senior

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Anno: Matricola

Mortensen, Sven

Garcia, Cesare

La variazione illustrata nel codice seguente ordina gli anni della classe e quindi ordina gli studenti entro 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 altre informazioni su Group By, vedere Clausola Group By.

Vedere anche