LINQ (Language-Integrated Query)Language Integrated Query (LINQ)

LINQ (Language-Integrated Query) è il nome di un set di tecnologie basate sull'integrazione delle funzionalità di query direttamente nel linguaggio C#.Language-Integrated Query (LINQ) is the name for a set of technologies based on the integration of query capabilities directly into the C# language. In genere, le query sui dati vengono espresse come stringhe semplici senza il controllo dei tipi in fase di compilazione o il supporto di IntelliSense.Traditionally, queries against data are expressed as simple strings without type checking at compile time or IntelliSense support. È anche necessario apprendere un linguaggio di query diverso per ogni tipo di origine dati: database SQL, documenti XML, vari servizi Web e così via.Furthermore, you have to learn a different query language for each type of data source: SQL databases, XML documents, various Web services, and so on. Con LINQ, una query è un costrutto del linguaggio di prima classe, come le classi, i metodi e gli eventi.With LINQ, a query is a first-class language construct, just like classes, methods, events.

Per uno sviluppatore che scrive query, la parte integrata nel linguaggio più visibile di LINQ è l'espressione di query.For a developer who writes queries, the most visible "language-integrated" part of LINQ is the query expression. Le espressioni di query vengono scritte con una sintassi di query dichiarativa.Query expressions are written in a declarative query syntax. Tramite la sintassi di query è possibile eseguire operazioni di filtro, ordinamento e raggruppamento sulle origini dati usando una quantità minima di codice.By using query syntax, you can perform filtering, ordering, and grouping operations on data sources with a minimum of code. Vengono usati gli stessi modelli di espressioni di query di base per eseguire una query e trasformare i dati in database SQL, set di dati ADO .NET, documenti e flussi XML e raccolte .NET.You use the same basic query expression patterns to query and transform data in SQL databases, ADO .NET Datasets, XML documents and streams, and .NET collections.

L'esempio seguente mostra l'operazione di query completa.The following example shows the complete query operation. L'operazione completa include la creazione di un'origine dati, la definizione dell'espressione di query e l'esecuzione della query in un'istruzione foreach.The complete operation includes creating a data source, defining the query expression, and executing the query in a foreach statement.

class LINQQueryExpressions
{
    static void Main()
    {
        
        // Specify the data source.
        int[] scores = new int[] { 97, 92, 81, 60 };

        // Define the query expression.
        IEnumerable<int> scoreQuery =
            from score in scores
            where score > 80
            select score;

        // Execute the query.
        foreach (int i in scoreQuery)
        {
            Console.Write(i + " ");
        }            
    }
}
// Output: 97 92 81

Panoramica sulle espressioni di queryQuery expression overview

  • Le espressioni di query possono essere usate per eseguire una query e trasformare dati da qualsiasi origine dati abilitata per LINQ.Query expressions can be used to query and to transform data from any LINQ-enabled data source. Una sola query, ad esempio, è in grado di recuperare dati da un database SQL e di produrre un flusso XML come output.For example, a single query can retrieve data from a SQL database, and produce an XML stream as output.

  • Le espressioni di query sono facili da gestire perché usano molti costrutti di linguaggio C# di uso comune.Query expressions are easy to master because they use many familiar C# language constructs.

  • Le variabili presenti in un'espressione di query sono tutte fortemente tipizzate, anche se in molti casi non è necessario specificare il tipo in modo esplicito perché il compilatore è in grado di dedurlo.The variables in a query expression are all strongly typed, although in many cases you do not have to provide the type explicitly because the compiler can infer it. Per altre informazioni, vedere Relazioni tra i tipi nelle operazioni di query LINQ.For more information, see Type relationships in LINQ query operations.

  • Una query non viene eseguita finché non si esegue l'iterazione della variabile di query, ad esempio in un'istruzione foreach.A query is not executed until you iterate over the query variable, for example, in a foreach statement. Per altre informazioni, vedere Introduzione alle query LINQ.For more information, see Introduction to LINQ queries.

  • In fase di compilazione, le espressioni di query vengono convertite in chiamate al metodo dell'operatore query standard secondo le regole definite nella specifica C#.At compile time, query expressions are converted to Standard Query Operator method calls according to the rules set forth in the C# specification. Le query che possono essere espresse usando la sintassi di query possono essere espresse anche usando la sintassi dei metodi.Any query that can be expressed by using query syntax can also be expressed by using method syntax. Nella maggior parte dei casi, tuttavia, la sintassi di query è più leggibile e concisa.However, in most cases query syntax is more readable and concise. Per altre informazioni, vedere Specifiche del linguaggio C# e Panoramica degli operatori di query standard.For more information, see C# language specification and Standard query operators overview.

  • Come regola di scrittura delle query LINQ, è consigliabile usare la sintassi di query quando possibile e la sintassi dei metodi quando necessario.As a rule when you write LINQ queries, we recommend that you use query syntax whenever possible and method syntax whenever necessary. Tra le due diverse forme non esiste differenza semantica o a livello di prestazioni.There is no semantic or performance difference between the two different forms. Le espressioni di query sono spesso più leggibili delle espressioni equivalenti scritte nella sintassi dei metodi.Query expressions are often more readable than equivalent expressions written in method syntax.

  • Per alcune operazioni di query, ad esempio Count o Max, non è presente una clausola dell'espressione di query equivalente. Tali espressioni devono quindi essere espresse come chiamata di metodo.Some query operations, such as Count or Max, have no equivalent query expression clause and must therefore be expressed as a method call. La sintassi dei metodi può essere combinata con la sintassi di query in diversi modi.Method syntax can be combined with query syntax in various ways. Per altre informazioni, vedere Sintassi di query e sintassi di metodi in LINQ.For more information, see Query syntax and method syntax in LINQ.

  • Le espressioni di query possono essere compilate in alberi delle espressioni o in delegati, a seconda del tipo al quale viene applicata la query.Query expressions can be compiled to expression trees or to delegates, depending on the type that the query is applied to. Le query IEnumerable<T> vengono compilate in delegati.IEnumerable<T> queries are compiled to delegates. Le query IQueryable e IQueryable<T> vengono compilate in alberi delle espressioni.IQueryable and IQueryable<T> queries are compiled to expression trees. Per altre informazioni, vedere Alberi delle espressioni.For more information, see Expression trees.

Passaggi successiviNext steps

Per altre informazioni dettagliate su LINQ, iniziare ad acquisire dimestichezza con alcuni concetti di base nella sezione introduttiva Nozioni fondamentali sulle espressioni di query e quindi leggere la documentazione per la tecnologia LINQ a cui si è interessati:To learn more details about LINQ, start by becoming familiar with some basic concepts in Query expression basics, and then read the documentation for the LINQ technology in which you are interested:

Per approfondire LINQ in generale, vedere LINQ in C#.To gain a deeper understanding of LINQ in general, see LINQ in C#.

Per iniziare a utilizzare LINQ in C#, vedere l'esercitazione Uso di LINQ.To start working with LINQ in C#, see the tutorial Working with LINQ.