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
Avviare Visual Studio.
Scegliere Nuovo dal menu File, quindi fare clic su Progetto.
Nell'elenco Modelli installati fare clic su Visual Basic.
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.
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.
Importante 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
- Seguire il modello nel metodo getStudents per aggiungere un'altra istanza della classe Student all'elenco.Con l'aggiunta dello studente vengono introdotti gli inizializzatori di oggetto.Per ulteriori informazioni, vedere Inizializzatori di oggetto: tipi denominati e tipi anonimi (Visual Basic).
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
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
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
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
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.
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
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
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.
Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.
Per introdurre un identificatore locale
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
Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.
Per proiettare un campo nella clausola Select
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
Posizionare il puntatore del mouse su studentQuery3 nel codice per verificare che il tipo assegnato sia IEnumerable(Of String).
Compilare ed eseguire l'applicazione premendo CTRL+F5.Osservare i risultati nella finestra della console.
Per creare un tipo anonimo nella clausola Select
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
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:
Vedere anche
Attività
Procedura dettagliata: scrittura di query in C# (LINQ)
Concetti
Inferenza del tipo di variabile locale (Visual Basic)
Inizializzatori di oggetto: tipi denominati e tipi anonimi (Visual Basic)
Introduzione a LINQ in Visual Basic
Altre risorse
LINQ (Language-Integrated Query)