LINQ (Language Integrated query) offre la possibilità di integrare perfettamente la sintassi di query dichiarativa in linguaggi imperativi, principalmente C# e VB.NET. Lo sviluppo di LINQ ha risolto i problemi riscontrati dagli sviluppatori che lavorano in ambienti orientati agli oggetti durante l’esecuzione delle query. È stato introdotto come parte di Microsoft® .NET Framework versione 3.5 nel novembre 2007 e nel nome in codice di Visual Studio® “Orcas”.
Prima della creazione di query integrate nel linguaggio, i linguaggi .NET non avevano un modo nativo per interrogare database relazionali o documenti XML. Gli sviluppatori che scrivevano in questi linguaggi dovevano incorporare rispettivamente SQL o XQuery come stringhe e mappare manualmente i dati risultanti agli oggetti .NET. Le stringhe di query e i mapping incorporati non possono essere convalidati dai compilatori .NET, consentendo l’individuazione di potenziali errori in fase di esecuzione.
Un altro problema che gli sviluppatori hanno dovuto affrontare prima della query integrata nel linguaggio era che i linguaggi .NET avevano solo una sintassi orientata agli oggetti per interrogare raccolte di oggetti .NET. In genere, lo sviluppatore itera su un’intera raccolta di sorgenti, costruendo nuove raccolte di risultati in base a criteri di ricerca. Lo sviluppatore potrebbe anche trasformare i dati durante la creazione delle raccolte di risultati. Questo approccio era ingombrante; una semplice query di selezione scritta in C# o VB richiederebbe almeno cinque righe di codice, mentre la stessa query richiederebbe una riga di codice in un linguaggio di query.
Le sfide dell’esecuzione di query all’interno di un ambiente orientato agli oggetti hanno dato a Microsoft l’impulso per creare LINQ. LINQ fornisce una sintassi di query che ricorda SQL da usare in linea con C# o VB, completa di controllo del tipo statico. Quando si eseguono query su raccolte .NET, invece di usare cicli annidati, gli sviluppatori possono usare la sintassi LINQ per selezionare elementi e trasformare i dati. Tra gli altri vantaggi, questo si traduce in un minor numero di righe di codice rispetto alla sintassi puramente orientata agli oggetti.
Quando si accede a origini dati esterne, LINQ e i componenti di supporto eliminano la necessità di linguaggi di query incorporati e mapping di dati all’interno di un linguaggio .NET stesso. Per eseguire la mappatura dei dati, LINQ dipende da componenti chiamati provider LINQ. LINQ-to-Objects è il provider di stock che consente a LINQ di accedere alle raccolte .NET. Allo stesso modo, esistono provider per accedere a database relazionali e documenti XML. La maggior parte di questi provider sono componenti di terze parti non inclusi in .NET Framework. Indipendentemente dal provider utilizzato, tutte le query usano la stessa sintassi LINQ.
Tra la sintassi di query integrata nel linguaggio e i provider è presente una libreria di operatori di query aggiunta a .NET Framework come parte delle funzionalità LINQ. Questi operatori eseguono attività come il filtraggio, l’ordinamento, le operazioni di teoria degli insiemi e l’aggregazione. Poiché questi operatori fanno parte di .NET Framework, possono essere usati anche senza LINQ se lo sviluppatore lo desidera.