Procedura dettagliata: Scrittura di query in Visual BasicWalkthrough: Writing Queries in Visual Basic

Questa procedura dettagliata illustra come è possibile usare le funzionalità del linguaggio LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) Visual Basic per scrivere espressioni di query.This walkthrough demonstrates how you can use Visual Basic language features to write LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) query expressions. Nella procedura dettagliata viene illustrato come creare query in un elenco di oggetti Student, come eseguire le query e come modificarli.The walkthrough demonstrates how to create queries on a list of Student objects, how to run the queries, and how to modify them. Le query includono diverse funzionalità, inclusi gli inizializzatori di oggetto, l'inferenza del tipo locale e i tipi anonimi.The queries incorporate several features including object initializers, local type inference, and anonymous types.

Al termine di questa procedura dettagliata, si sarà pronti a passare agli esempi e alla documentazione per il provider LINQLINQ specifico a cui si è interessati.After completing this walkthrough, you will be ready to move on to the samples and documentation for the specific LINQLINQ provider you are interested in. LINQLINQi provider LINQ to SQLLINQ to SQLincludono, LINQ to DataSet e LINQ to XMLLINQ to XML.providers include LINQ to SQLLINQ to SQL, LINQ to DataSet, and LINQ to XMLLINQ to XML.

Creare un progettoCreate a Project

Per creare un progetto di applicazione consoleTo create a console application project

  1. Avviare Visual Studio.Start Visual Studio.

  2. Scegliere Nuovo dal menu File, quindi fare clic su Progetto.On the File menu, point to New, and then click Project.

  3. Nell'elenco modelli installati fare clic su Visual Basic.In the Installed Templates list, click Visual Basic.

  4. Nell'elenco dei tipi di progetto fare clic su applicazione console.In the list of project types, click Console Application. Nella casella nome Digitare un nome per il progetto, quindi fare clic su OK.In the Name box, type a name for the project, and then click OK.

    Viene creato un progetto.A project is created. Per impostazione predefinita, contiene un riferimento a System. Core. dll.By default, it contains a reference to System.Core.dll. Inoltre, l'elenco degli spazi dei nomi importati nella pagina riferimenti, Progettazione progetti (Visual Basic) include lo System.Linq spazio dei nomi.Also, the Imported namespaces list on the References Page, Project Designer (Visual Basic) includes the System.Linq namespace.

  5. Nella pagina compilazione, Progettazione progetti (Visual Basic), assicurarsi che l' opzione deduce sia impostata su on.On the Compile Page, Project Designer (Visual Basic), ensure that Option infer is set to On.

Aggiungere un'origine dati in memoriaAdd an In-Memory Data Source

L'origine dati per le query in questa procedura dettagliata è un elenco Student di oggetti.The data source for the queries in this walkthrough is a list of Student objects. Ogni Student oggetto contiene un nome, un cognome, un anno di classe e un rango accademico nel corpo degli studenti.Each Student object contains a first name, a last name, a class year, and an academic rank in the student body.

Per aggiungere l'origine datiTo add the data source

  • Definire una Student classe e creare un elenco di istanze della classe.Define a Student class, and create a list of instances of the class.

    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.The code needed to define the Student class and create the list used in the walkthrough examples is provided in How to: Create a List of Items. È possibile copiarlo da questa posizione e incollarlo nel progetto.You can copy it from there and paste it into your project. Il nuovo codice sostituisce il codice visualizzato quando è stato creato il progetto.The new code replaces the code that appeared when you created the project.

Per aggiungere un nuovo studente all'elenco degli studentiTo add a new student to the students list

  • Seguire il modello nel getStudents metodo per aggiungere un'altra istanza Student della classe all'elenco.Follow the pattern in the getStudents method to add another instance of the Student class to the list. Aggiungendo lo studente si introdurranno gli inizializzatori di oggetto.Adding the student will introduce you to object initializers. Per ulteriori informazioni, vedere inizializzatori di oggetto: Tipidenominati e anonimi.For more information, see Object Initializers: Named and Anonymous Types.

Creare una queryCreate a Query

Quando viene eseguita, la query aggiunta in questa sezione produce un elenco degli studenti il cui rango accademico li inserisce nei primi dieci.When executed, the query added in this section produces a list of the students whose academic rank puts them in the top ten. Poiché la query seleziona l'oggetto Student completo ogni volta, il tipo del risultato della query è IEnumerable(Of Student).Because the query selects the complete Student object each time, the type of the query result is IEnumerable(Of Student). Tuttavia, il tipo della query non viene in genere specificato nelle definizioni di query.However, the type of the query typically is not specified in query definitions. Al contrario, il compilatore usa l'inferenza del tipo locale per determinare il tipo.Instead, the compiler uses local type inference to determine the type. Per altre informazioni, vedere inferenza dei tipi locali.For more information, see Local Type Inference. La variabile di intervallo della query currentStudent,, funge da riferimento a ogni Student istanza nell'origine, studentsfornendo l'accesso alle proprietà di ogni oggetto in students.The query's range variable, currentStudent, serves as a reference to each Student instance in the source, students, providing access to the properties of each object in students.

Per creare una query sempliceTo create a simple query

  1. Individuare la posizione nel Main metodo del progetto contrassegnata come segue:Find the place in the Main method of the project that is marked as follows:

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

    Copiare il codice seguente e incollarlo in.Copy the following code and paste it in.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Posizionare il puntatore del mouse studentQuery sul codice per verificare che il tipo assegnato dal compilatore sia. IEnumerable(Of Student)Rest the mouse pointer over studentQuery in your code to verify that the compiler-assigned type is IEnumerable(Of Student).

Eseguire la queryRun the Query

La variabile studentQuery contiene la definizione della query, non i risultati dell'esecuzione della query.The variable studentQuery contains the definition of the query, not the results of running the query. Un meccanismo tipico per l'esecuzione di una query For Each è un ciclo.A typical mechanism for running a query is a For Each loop. È possibile accedere a ogni elemento nella sequenza restituita tramite la variabile di iterazione del ciclo.Each element in the returned sequence is accessed through the loop iteration variable. Per ulteriori informazioni sull'esecuzione di query, vedere scrittura della prima query LINQ.For more information about query execution, see Writing Your First LINQ Query.

Per eseguire la queryTo run the query

  1. Aggiungere il seguente For Each ciclo sotto la query nel progetto.Add the following For Each loop below the query in your project.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Posizionare il puntatore del mouse sulla variabile studentRecord di controllo loop per visualizzarne il tipo di dati.Rest the mouse pointer over the loop control variable studentRecord to see its data type. Il tipo di studentRecord viene dedotto Studentcome, perché studentQuery restituisce una raccolta di istanze di Student .The type of studentRecord is inferred to be Student, because studentQuery returns a collection of Student instances.

  3. Compilare ed eseguire l'applicazione premendo CTRL + F5.Build and run the application by pressing CTRL+F5. Si notino i risultati nella finestra della console.Note the results in the console window.

Modificare la queryModify the Query

È più semplice analizzare i risultati della query se sono in un ordine specificato.It is easier to scan query results if they are in a specified order. È possibile ordinare la sequenza restituita in base a qualsiasi campo disponibile.You can sort the returned sequence based on any available field.

Per ordinare i risultatiTo order the results

  1. Aggiungere la clausola Order By seguente tra l' Where istruzione e l' Select istruzione della query.Add the following Order By clause between the Where statement and the Select statement of the query. Con Order By la clausola i risultati vengono ordinati in ordine alfabetico da a a Z, in base al cognome di ogni studente.The Order By clause will order the results alphabetically from A to Z, according to the last name of each student.

    Order By currentStudent.Last Ascending
    
  2. Per eseguire l'ordinamento in base al cognome e quindi al nome, aggiungere entrambi i campi alla query:To order by last name and then first name, add both fields to the query:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    È anche possibile specificare Descending di ordinare da Z a a.You can also specify Descending to order from Z to A.

  3. Compilare ed eseguire l'applicazione premendo CTRL + F5.Build and run the application by pressing CTRL+F5. Si notino i risultati nella finestra della console.Note the results in the console window.

Per introdurre un identificatore localeTo introduce a local identifier

  1. Aggiungere il codice in questa sezione per introdurre un identificatore locale nell'espressione di query.Add the code in this section to introduce a local identifier in the query expression. L'identificatore locale conterrà un risultato intermedio.The local identifier will hold an intermediate result. Nell'esempio name seguente è un identificatore che include una concatenazione del nome e del cognome dello studente.In the following example, name is an identifier that holds a concatenation of the student's first and last names. 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.A local identifier can be used for convenience, or it can enhance performance by storing the results of an expression that would otherwise be calculated multiple times.

    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.Build and run the application by pressing CTRL+F5. Si notino i risultati nella finestra della console.Note the results in the console window.

Per proiettare un campo nella clausola SELECTTo project one field in the Select clause

  1. Aggiungere la query e For Each il ciclo da questa sezione per creare una query che produce una sequenza i cui elementi differiscono dagli elementi nell'origine.Add the query and For Each loop from this section to create a query that produces a sequence whose elements differ from the elements in the source. Nell'esempio seguente, l'origine è una raccolta di Student oggetti, ma viene restituito solo un membro di ogni oggetto: il nome degli studenti il cui cognome è Garcia.In the following example, the source is a collection of Student objects, but only one member of each object is returned: the first name of students whose last name is Garcia. Poiché currentStudent.First è una stringa, il tipo di dati della sequenza restituita studentQuery3 da IEnumerable(Of String)è, una sequenza di stringhe.Because currentStudent.First is a string, the data type of the sequence returned by studentQuery3 is IEnumerable(Of String), a sequence of strings. Come negli esempi precedenti, l'assegnazione di un tipo di dati studentQuery3 per viene lasciata dal compilatore per determinare utilizzando l'inferenza del tipo locale.As in earlier examples, the assignment of a data type for studentQuery3 is left for the compiler to determine by using local type inference.

    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 studentQuery3 sul codice per verificare che il tipo assegnato sia. IEnumerable(Of String)Rest the mouse pointer over studentQuery3 in your code to verify that the assigned type is IEnumerable(Of String).

  3. Compilare ed eseguire l'applicazione premendo CTRL + F5.Build and run the application by pressing CTRL+F5. Si notino i risultati nella finestra della console.Note the results in the console window.

Per creare un tipo anonimo nella clausola SELECTTo create an anonymous type in the Select clause

  1. Aggiungere il codice da questa sezione per vedere come vengono usati i tipi anonimi nelle query.Add the code from this section to see how anonymous types are used in queries. Vengono usati nelle query quando si desidera restituire più campi dall'origine dati anziché record completi (currentStudent record negli esempi precedenti) o campi singoli (First nella sezione precedente).You use them in queries when you want to return several fields from the data source rather than complete records (currentStudent records in previous examples) or single fields (First in the preceding section). Anziché definire un nuovo tipo denominato che contiene i campi che si desidera includere nel risultato, è necessario specificare i campi nella Select clausola e il compilatore crea un tipo anonimo con tali campi come proprietà.Instead of defining a new named type that contains the fields you want to include in the result, you specify the fields in the Select clause and the compiler creates an anonymous type with those fields as its properties. Per altre informazioni, vedere Tipi anonimi.For more information, see Anonymous Types.

    Nell'esempio seguente viene creata una query che restituisce il nome e il rango degli anziani il cui rango accademico è compreso tra 1 e 10, in ordine di rango accademico.The following example creates a query that returns the name and rank of seniors whose academic rank is between 1 and 10, in order of academic rank. In questo esempio, il tipo di studentQuery4 deve essere dedotto perché la Select clausola restituisce un'istanza di un tipo anonimo e un tipo anonimo non ha un nome utilizzabile.In this example, the type of studentQuery4 must be inferred because the Select clause returns an instance of an anonymous type, and an anonymous type has no usable name.

    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.Build and run the application by pressing CTRL+F5. Si notino i risultati nella finestra della console.Note the results in the console window.

Esempi aggiuntiviAdditional Examples

A questo punto, dopo aver compreso le nozioni di base, di seguito è riportato un elenco di esempi aggiuntivi per LINQLINQ illustrare la flessibilità e la potenza delle query.Now that you understand the basics, the following is a list of additional examples to illustrate the flexibility and power of LINQLINQ queries. Ogni esempio è preceduto da una breve descrizione dell'operazione.Each example is preceded by a brief description of what it does. Posizionare il puntatore del mouse sulla variabile dei risultati della query per ogni query per visualizzare il tipo dedotto.Rest the mouse pointer over the query result variable for each query to see the inferred type. Usare un For Each ciclo per produrre i risultati.Use a For Each loop to produce the results.

' 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 aggiuntiveAdditional Information

Dopo aver acquisito familiarità con i concetti di base relativi all'utilizzo delle query, è possibile leggere la documentazione e gli esempi relativi al tipo LINQLINQ specifico di provider a cui si è interessati:After you are familiar with the basic concepts of working with queries, you are ready to read the documentation and samples for the specific type of LINQLINQ provider that you are interested in:

Vedere ancheSee also