Utilizzo di LINQ in C#

Aggiornamento: novembre 2007

Le applicazioni utilizzano generalmente i dati presenti nei database SQL o nei documenti XML. In passato gli sviluppatori dovevano imparare un linguaggio di programmazione principale, ad esempio C#, e un linguaggio secondario, ad esempio SQL o XQuery. LINQ (Language-Integrated Query) consente di sfruttare le funzionalità di query nel linguaggio C#. Anziché imparare un linguaggio di query separato, ora è possibile utilizzare le conoscenze di C#, oltre ad alcune parole chiave e concetti aggiuntivi, per eseguire una query su database SQL, dataset ADO.NET, documenti XML e qualsiasi classe di insiemi .NET che implementi l'interfaccia IEnumerable.

Vantaggi dell'utilizzo di LINQ

  • Sintassi comune per la scrittura di query.

  • Controllo degli errori di sintassi in fase di compilazione e indipendenza dai tipi.

  • Supporto del debugger migliorato.

  • Supporto IntelliSense.

  • Possibilità di utilizzare direttamente gli elementi XML anziché creare un documento XML contenitore, come richiesto con DOM W3C.

  • Modifica dei documenti XML in memoria potente e ancora più semplice da utilizzare rispetto a XPath o XQuery.

  • Potenti funzionalità di filtro, ordinamento e raggruppamento.

  • Modello coerente per l'utilizzo dei dati con tutti i diversi tipi di origini e formati dati.

Miglioramenti nel linguaggio C# che supportano LINQ

Di seguito sono riportate alcune nuove strutture del linguaggio aggiunte a C# 3.0 per supportare LINQ:

Struttura del linguaggio

Descrizione

Espressioni di query

Una sintassi di query dichiarativa utilizzata per eseguire una query sui dati da qualsiasi origine dati con supporto LINQ. Per ulteriori informazioni, vedere°Espressioni query LINQ (Guida per programmatori C#) e Funzionalità C# 3.0 che supportano LINQ.

Variabili tipizzate in modo implicito

Una variabile, specificata con il modificatore var che consente al compilatore di dedurre il tipo della variabile. Per ulteriori informazioni, vedere°Variabili locali tipizzate in modo implicito (Guida per programmatori C#) e Funzionalità C# 3.0 che supportano LINQ.

Inizializzatori di oggetti

Consentono l'inizializzazione di oggetti senza una chiamata esplicita a un costruttore per l'oggetto. Per ulteriori informazioni, vedere Inizializzatori di oggetto e di insieme (Guida per programmatori C#) e Funzionalità C# 3.0 che supportano LINQ.

Tipi anonimi

Consentono al compilatore di creare oggetti senza dover specificare un tipo di dati denominato. Il nome del tipo è disponibile solo al compilatore. Per ulteriori informazioni, vedere Tipi anonimi (Guida per programmatori C#) e Funzionalità C# 3.0 che supportano LINQ.

Metodi di estensione

Consentono l'estensione di qualsiasi tipo esistente associando metodi statici al tipo. Per ulteriori informazioni, vedere Funzionalità C# 3.0 che supportano LINQ.

Espressioni lambda

Un'espressione in linea o un blocco di istruzioni che può essere utilizzato con un tipo delegato.

Per ulteriori informazioni, vedere Espressioni lambda (Guida per programmatori C#) e Funzionalità C# 3.0 che supportano LINQ.

Scrittura di query LINQ

La struttura di base di un'espressione di query LINQ è identica indipendentemente se si utilizzano dataset ADO.NET, database SQL, insiemi .NET o documenti XML. Un'espressione di query inizia con la clausola from, seguita dalle clausole di query where, orderby, select e così via. L'espressione completa viene archiviata in una variabile di query che può essere eseguita o modificata un numero illimitato di volte. La sintassi dell'espressione di query è analoga alla sintassi di SQL. Ad esempio, è possibile scrivere una query LINQ che restituisca tutti gli studenti presenti in un database students che hanno science come materia di specializzazione, utilizzando la sintassi seguente:

IEnumerable<Student> studentQuery =

from student in studentApp.students

where student.Major == "Science"

select student;

Per ulteriori informazioni sulle espressioni di query, vedere Operazioni di query di base (LINQ), Introduzione alle query LINQ e Procedura dettagliata: scrittura di query in C# (LINQ).

LINQ to Objects

L'espressione LINQ to Objects si riferisce all'utilizzo di LINQ per eseguire una query su raccolte di dati in memoria come le classi negli spazi dei nomi System.Collections e System.Collections.Generic. Queste classi includono ArrayList, List<T>, Dictionary<K,T> e così via. È possibile eseguire una query sulle matrici poiché supportano implicitamente IEnumerable<T>. Per ulteriori informazioni, vedere LINQ to Objects.

È anche possibile importare un file di testo in strutture dei dati enumerabili ed eseguire una query per filtrarne o ordinarne il contenuto. Per un esempio, vedere Procedura: contare le occorrenze di una parola in una stringa (LINQ).

LINQ to SQL

Utilizzare LINQ to SQL per accedere ai database SQL Server e SQL Server Express tramite un livello dell'oggetto fortemente tipizzato creato utilizzando O/R Designer.

È possibile utilizzare O/R Designer per eseguire il mapping delle classi LINQ to SQL alle tabelle di un database e scrivere quindi le query LINQ per associare i dati ai controlli dell'applicazione. Ad esempio, la query LINQ riportata di seguito associa i risultati di una query LINQ (tutti i clienti degli Stati Uniti) a un'origine di associazione di un controllo DataGridView.

var CustomersQuery = from customers in northwindSampleDataContext1.Customers
                      where customers.Country == "US"
                      select customers;
customerBindingSource.DataSource = CustomersQuery;

Per ulteriori informazioni, vedere LINQ to SQL, Cenni preliminari su Progettazione relazionale oggetti, Procedura dettagliata: creazione di classi LINQ to SQL (Progettazione relazionale oggetti) e Procedura: aggiungere classi LINQ to SQL a un progetto (Progettazione relazionale oggetti).

Nota:

O/R Designer non supporta attualmente i database SQL Server Compact 3.5. Per informazioni su come ottenere SQL Server Express Edition, vedere la sezione relativa a come ottenere SQL Server Express Edition in Procedura: installare database di esempio.

Da LINQ a DataSet

DataSet viene utilizzato per associare i dati ai controlli di un'applicazione. Anziché connettersi direttamente al database, DataSet consente a un'applicazione di utilizzare dati o sottoinsiemi di diverse origini dati non in linea (memorizzati nella cache). Quando l'applicazione viene portata in linea, le modifiche apportate a DataSet possono essere aggiornate nel database.

LINQ to Dataset rende l'esecuzione di una query sui dati memorizzati nella cache più veloce e semplice rispetto ai metodi di filtro e ordinamento disponibili in DataSet. Per ulteriori informazioni, vedere LINQ to DataSet.

LINQ to XML

LINQ to XML consente di creare e modificare facilmente i documenti XML utilizzando le espressioni di query LINQ anziché XPath o XQuery. LINQ to XML è una nuova API di programmazione XML in memoria che utilizza costrutti di programmazione moderni anziché il modello DOM (Document Object Model) W3C. Per ulteriori informazioni, vedere Differenze tra LINQ to XML e DOM, LINQ to XML e Cenni preliminari sulle classi LINQ to XML.

Vedere anche

Concetti

Guida introduttiva (LINQ to SQL)

Altre risorse

Nozioni di base su LINQ in C#

Guida introduttiva (LINQ to DataSet)

Guida introduttiva (LINQ to XML)