Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa procedura dettagliata illustra come usare le funzionalità del linguaggio Visual Basic per scrivere espressioni di query LINQ (Language-Integrated Query). La procedura dettagliata illustra come creare query in un elenco di oggetti Student, come eseguire le query e come modificarle. Le query includono diverse funzionalità, tra cui inizializzatori di oggetti, inferenza del tipo locale e tipi anonimi.
Dopo aver completato questa procedura dettagliata, si sarà pronti per passare agli esempi e alla documentazione per il provider LINQ specifico a cui si è interessati. I provider LINQ includono LINQ to SQL, LINQ to DataSet e LINQ to XML.
Creare un progetto
Per creare un progetto di applicazione console
Avvia Visual Studio.
Scegliere Nuovo dal menu Filee quindi fare clic su Progetto.
Nell'elenco Modelli installati fare clic su Visual Basic.
Nell'elenco dei tipi di progetto fare clic su Applicazione console. Nella casella Nome digitare un nome per il progetto e quindi fare clic su OK.
Viene creato un progetto. Per impostazione predefinita, contiene un riferimento a System.Core.dll. Inoltre, l'elenco Spazi dei nomi importati nella Pagina Riferimenti, Progettazione Progetto (Visual Basic) include lo System.Linq spazio dei nomi.
Nella pagina Compilazione Progettazione (Visual Basic) verificare che Option infer sia impostato su Attivato.
Aggiungere un'origine dati In-Memory
L'origine dati per le query in questa procedura dettagliata è un elenco di Student
oggetti. Ogni Student
oggetto contiene un nome, un cognome, un anno di classe e una classificazione accademica nel corpo dello studente.
Per aggiungere l'origine dati
Definire una
Student
classe e creare un elenco di istanze della classe .Importante
Il codice necessario per definire la
Student
classe e creare l'elenco usato negli esempi di procedura dettagliata è disponibile in Procedura: Creare un elenco di elementi. È possibile copiarlo da lì e incollarlo nel progetto. Il nuovo codice sostituisce il codice visualizzato al momento della creazione del progetto.
Per aggiungere un nuovo studente all'elenco degli studenti
- Seguire il modello nel
getStudents
metodo per aggiungere un'altra istanza dellaStudent
classe all'elenco. L'aggiunta dello studente ti farà conoscere gli inizializzatori di oggetti. Per altre informazioni, vedere Inizializzatori di oggetti: tipi denominati e anonimi.
Creare una query
Quando viene eseguita, la query aggiunta in questa sezione genera un elenco degli studenti il cui rango accademico li inserisce nei primi dieci. Poiché la query seleziona l'oggetto completo Student
ogni volta, il tipo del risultato della query è IEnumerable(Of Student)
. Tuttavia, il tipo della query in genere non viene specificato nelle definizioni di query. Il compilatore usa invece l'inferenza del tipo locale per determinare il tipo. Per altre informazioni, vedere Inferenza del tipo locale. La variabile di intervallo della query, currentStudent
, funge da riferimento a ogni Student
istanza nell'origine, students
, fornendo l'accesso alle proprietà di ogni oggetto in students
.
Per creare una query semplice
Trovare la posizione nel
Main
metodo 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 codice seguente 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 siaIEnumerable(Of Student)
.
Esegui la 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 è un For Each
ciclo. Ogni elemento nella sequenza restituita è accessibile tramite la variabile di iterazione del ciclo. Per altre informazioni sull'esecuzione di query, vedere Scrittura della prima query LINQ.
Per eseguire la query
Aggiungi il seguente ciclo
For Each
, sotto la query nel tuo progetto.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Posizionare il puntatore del mouse sulla variabile
studentRecord
di controllo del ciclo per visualizzarne il tipo di dati. Il tipo distudentRecord
viene dedotto comeStudent
, perchéstudentQuery
restituisce una raccolta diStudent
istanze.Compilare ed eseguire l'applicazione premendo CTRL+F5. Si notino i risultati nella finestra della console.
Modificare la query
È più semplice analizzare i risultati delle query se sono in un ordine specificato. È possibile ordinare la sequenza restituita in base a qualsiasi campo disponibile.
Per ordinare i risultati
Aggiungere la clausola seguente
Order By
tra l'istruzioneWhere
e l'istruzioneSelect
della query. LaOrder By
clausola ordinerà i risultati alfabeticamente da A a Z, in base al cognome di ogni studente.Order By currentStudent.Last Ascending
Per ordinare in base al cognome e quindi al nome, aggiungere entrambi i campi alla query:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
È anche possibile specificare
Descending
l'ordine da Z a A.Compilare ed eseguire l'applicazione premendo CTRL+F5. Si notino 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 del cognome dello studente. Un identificatore locale può essere usato per praticità oppure può migliorare le prestazioni archiviando i risultati di un'espressione che altrimenti verrebbe calcolata 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. Si notino i risultati nella finestra della console.
Per proiettare un campo nella clausola Select
Aggiungere la query e
For Each
il ciclo da questa sezione per creare una query che produca una sequenza i cui elementi differiscono dagli elementi nell'origine. Nell'esempio seguente l'origine è una raccolta diStudent
oggetti, ma viene restituito un solo membro di ogni oggetto: il nome degli studenti il cui cognome è Garcia. PoichécurrentStudent.First
è una stringa, il tipo di dati della sequenza restituita dastudentQuery3
èIEnumerable(Of String)
, una sequenza di stringhe. Come negli esempi precedenti, l'assegnazione di un tipo di dati perstudentQuery3
viene lasciata al compilatore per determinare usando l'inferenza del tipo 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 siaIEnumerable(Of String)
.Compilare ed eseguire l'applicazione premendo CTRL+F5. Si notino i risultati nella finestra della console.
Per creare un tipo anonimo nella clausola Select
Aggiungere il codice di questa sezione per vedere come vengono usati i tipi anonimi nelle query. Tali campi vengono usati nelle query quando si desidera restituire diversi campi dall'origine dati anziché record completi (
currentStudent
record 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 nellaSelect
clausola e il compilatore crea un tipo anonimo con tali campi come proprietà. Per altre informazioni, vedere Tipi anonimi.Nell'esempio seguente viene creata una query che restituisce il nome e il rango di senior il cui rango accademico è compreso tra 1 e 10, in ordine di rango accademico. In questo esempio, il tipo di
studentQuery4
deve essere dedotto perché laSelect
clausola restituisce un'istanza di un tipo anonimo e un tipo anonimo non ha 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. Si notino i risultati nella finestra della console.
Altri esempi
Dopo aver compreso le nozioni di base, di seguito è riportato un elenco di esempi aggiuntivi per illustrare la flessibilità e la potenza delle query LINQ. Ogni esempio è preceduto da una breve descrizione delle operazioni che esegue. Posizionare il puntatore del mouse sulla variabile dei risultati di ciascuna query per visualizzare il tipo dedotto. Per produrre i risultati, utilizzare un ciclo For Each
.
' 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 familiarità con i concetti di base relativi all'uso delle query, è possibile leggere la documentazione e gli esempi per il tipo specifico di provider LINQ a cui si è interessati: