Procedura dettagliata: scrittura delle query in Visual Basic

In questa procedura viene descritto come utilizzare le funzionalità del linguaggio Visual Basic per scrivere espressioni di query LINQ (Language-Integrated Query).Nella procedura dettagliata viene illustrato come creare query su un elenco di oggetti Student, come eseguire le query e come modificarle.Le query incorporano diverse funzionalità nuove di Visual Basic 2008, tra cui gli inizializzatori di oggetto, l'inferenza del tipo di variabile locale e i tipi anonimi.

Dopo avere completato questa procedura dettagliata sarà possibile passare agli esempi e alla documentazione per il provider LINQ specifico desiderato.I provider LINQ includono LINQ to SQL, LINQ to DataSet e LINQ to XML.

Creazione di un progetto

Per creare un progetto di applicazione console

  1. Avviare Visual Studio.

  2. Scegliere Nuovo dal menu File, quindi fare clic su Progetto.

  3. Nell'elenco Modelli installati fare clic su Visual Basic.

  4. Nell'elenco di tipi di progetto fare clic su Applicazione console.Nella casella Nome digitare un nome per il progetto, quindi scegliere OK.

    Viene creato un progetto.Per impostazione predefinita, contiene un riferimento a System.Core.dll.Inoltre, nell'elenco Spazi dei nomi importati nella Pagina Riferimenti, Progettazione progetti (Visual Basic) è incluso lo spazio dei nomi System.Linq.

  5. In Pagina Compilazione, Progettazione progetti (Visual Basic), assicurarsi che Option Infer è impostato su In.

Aggiunta di un'origine dati in memoria

L'origine dati per le query in questa procedura dettagliata è un elenco di oggetti Student.Ogni oggetto Student contiene un nome, un cognome, un anno della classe e un grado accademico del corpo studenti.

Per aggiungere l'origine dati

  • Definire una classe Student e creare un elenco di istanze della classe.

    Nota importanteImportante

    Il codice necessario per definire la classe Student e creare l'elenco utilizzato negli esempi della procedura dettagliata viene fornito in Procedura: creare un elenco di elementi.È possibile copiarlo e incollarlo nel progetto.Il codice nuovo sostituisce il codice visualizzato al momento della creazione del progetto.

Per aggiungere un nuovo studente all'elenco di studenti

Creazione di una query

Quando viene eseguita, la query aggiunta in questa sezione genera un elenco di studenti il cui grado accademico li inserisce tra i primi dieci.Poiché la query seleziona ogni volta l'intero oggetto Student, il tipo del risultato della query è IEnumerable(Of Student).Tuttavia, il tipo della query non viene generalmente specificato nelle definizioni della query.Il compilatore utilizza invece l'inferenza del tipo di variabile locale per determinare il tipo.Per ulteriori informazioni, vedere Inferenza del tipo di variabile locale (Visual Basic).La variabile di intervallo della query, currentStudent, funge da riferimento a ogni istanza Student nell'origine, students, fornendo l'accesso alle proprietà di ogni oggetto in students.

Per creare una query semplice

  1. Individuare il punto nel metodo Main del progetto contrassegnato come segue:

    ' ****Paste query and query execution code from the walkthrough,
    ' ****or any code of your own, here in Main.
    

    Copiare il seguente codice e incollarlo.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Posizionare il puntatore del mouse su studentQuery nel codice per verificare che il tipo assegnato dal compilatore sia IEnumerable(Of Student).

Esecuzione della query

La variabile studentQuery contiene la definizione della query, non i risultati dell'esecuzione della query.Un meccanismo tipico per l'esecuzione di una query è il ciclo For Each.È possibile accedere a ogni elemento nella sequenza restituita mediante la variabile di iterazione del ciclo.Per ulteriori informazioni sull'esecuzione delle query, vedere Scrittura della prima query LINQ (Visual Basic).

Per eseguire la query

  1. Aggiungere il seguente ciclo For Each sotto la query all'interno del progetto.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Posizionare il puntatore del mouse sulla variabile di controllo del ciclo studentRecord per visualizzarne il tipo di dati.Si deduce che il tipo di studentRecord sia Student, poiché studentQuery restituisce una raccolta di istanze Student.

  3. Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.

Modifica della query

È più semplice analizzare i risultati della query se vengono disposti in un determinato ordine.È possibile ordinare la sequenza restituita in base a qualsiasi campo disponibile.

Per ordinare i risultati

  1. Aggiungere la seguente clausola Order By tra l'istruzione Where e l'istruzione Select della query.La clausola Order By ordina i risultati alfabeticamente dalla A alla Z in base al cognome di ogni studente.

    Order By currentStudent.Last Ascending 
    
  2. Per ordinare in base al cognome e poi al nome, aggiungere entrambi i campi alla query:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending 
    

    È inoltre possibile specificare Descending per ordinare dalla Z alla A.

  3. Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.

Per introdurre un identificatore locale

  1. Aggiungere il codice in questa sezione per introdurre un identificatore locale nell'espressione di query.L'identificatore locale conterrà un risultato intermedio.Nell'esempio seguente name è un identificatore che contiene una concatenazione del nome e cognome dello studente.È possibile utilizzare un identificatore locale per motivi di praticità o perché migliora le prestazioni archiviando i risultati di un'espressione in modo da non doverla calcolare più volte.

    Dim studentQuery2 =
            From currentStudent In students
            Let name = currentStudent.Last & ", " & currentStudent.First
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By name Ascending
            Select currentStudent
    
    ' If you see too many results, comment out the previous
    ' For Each loop.
    For Each studentRecord In studentQuery2
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.

Per proiettare un campo nella clausola Select

  1. Aggiungere la query e il ciclo For Each da questa sezione per creare una query che generi una sequenza i cui elementi differiscono dagli elementi presenti nell'origine.Nell'esempio seguente l'origine è una raccolta di oggetti Student, ma viene restituito solo un membro di ogni oggetto: il nome degli studenti il cui cognome sia Garcia.Poiché currentStudent.First è una stringa, il tipo di dati della sequenza restituita da studentQuery3 è IEnumerable(Of String), una sequenza di stringhe.Come negli esempi precedenti, il compilatore effettua l'assegnazione del tipo di dati per studentQuery3 utilizzando l'inferenza del tipo di variabile locale.

    Dim studentQuery3 = From currentStudent In students
                        Where currentStudent.Last = "Garcia"
                        Select currentStudent.First
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery3
        Console.WriteLine(studentRecord)
    Next
    
  2. Posizionare il puntatore del mouse su studentQuery3 nel codice per verificare che il tipo assegnato sia IEnumerable(Of String).

  3. Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.

Per creare un tipo anonimo nella clausola Select

  1. Aggiungere il codice da questa sezione per vedere come vengono utilizzati i tipi anonimi nelle query.Vengono utilizzati nelle query per restituire diversi campi dall'origine dati anziché record completi (i record currentStudent negli esempi precedenti) o singoli campi (First nella sezione precedente).Anziché definire un nuovo tipo denominato contenente i campi da includere nel risultato, specificare i campi nella clausola di Select e il compilatore crea un tipo anonimo con tali campi come proprietà. Per ulteriori informazioni, vedere Tipi anonimi (Visual Basic).

    Nell'esempio seguente viene creata una query che restituisce il nome e il grado di studenti senior il cui grado accademico sia compreso tra 1 e 10.In questo esempio il tipo di studentQuery4 deve essere dedotto, poiché la clausola Select restituisce un'istanza di un tipo anonimo e i tipi anonimi non hanno un nome utilizzabile.

    Dim studentQuery4 =
            From currentStudent In students
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By currentStudent.Rank Ascending
            Select currentStudent.First, currentStudent.Last, currentStudent.Rank
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery4
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First &
                          ":  " & studentRecord.Rank)
    Next
    
  2. Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.

Esempi aggiuntivi

Una volta apprese le nozioni di base, è possibile esaminare l'elenco di esempi aggiuntivi riportato di seguito per comprendere la flessibilità e la potenza delle query LINQ.Ogni esempio è preceduto da una breve descrizione della relativa funzione.Posizionare il puntatore del mouse sulla variabile del risultato di ciascuna query per visualizzare il tipo derivato. Utilizzare un ciclo di For Each per generare i risultati.

' Find all students who are seniors.
Dim q1 = From currentStudent In students
         Where currentStudent.Year = "Senior"
         Select currentStudent

' Write a For Each loop to execute the query.
For Each q In q1
    Console.WriteLine(q.First & " " & q.Last)
Next

' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students
         Where currentStudent.First.StartsWith("C")
         Select currentStudent

' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students
         Where currentStudent.Rank < 40 And currentStudent.Year = "Senior"
         Select currentStudent

' Find all seniors with a lower rank than a student who 
' is not a senior.
Dim q4 = From student1 In students, student2 In students
         Where student1.Year = "Senior" And student2.Year <> "Senior" And
               student1.Rank > student2.Rank
         Select student1
         Distinct

' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students
         Order By currentStudent.Last
         Select Name = currentStudent.First & " " & currentStudent.Last

' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students
         Where currentStudent.Rank <= 20
         Into Count()

' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students
         Select currentStudent.Last
         Distinct
         Into Count()

' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students
         Order By currentStudent.Last
         Select currentStudent.Last Distinct

For Each nextName As String In q8
    lb.Items.Add(nextName)
Next

' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses,
         letter In letters
         Where proc.ProcessName.Contains(letter)
         Select proc

For Each proc In q9
    Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next

Informazioni aggiuntive

Dopo aver acquisito dimestichezza con i concetti di base relativi all'utilizzo delle query, è possibile leggere la documentazione e gli esempi per il tipo specifico di provider LINQ desiderato:

LINQ to Objects

LINQ to SQL

LINQ to XML

LINQ to DataSet

Vedere anche

Attività

Procedura dettagliata: scrittura di query in C# (LINQ)

Concetti

Risorse LINQ supplementari

Inferenza del tipo di variabile locale (Visual Basic)

Inizializzatori di oggetto: tipi denominati e tipi anonimi (Visual Basic)

Tipi anonimi (Visual Basic)

Introduzione a LINQ in Visual Basic

Altre risorse

LINQ (Language-Integrated Query)

“Introduzione a” and “Guida Introduttiva”

LINQ in Visual Basic

Query (Visual Basic)