LINQ e ADO.NET

Attualmente, molti sviluppatori aziendali devono usare due (o più) linguaggi di programmazione: un linguaggio di alto livello per la logica di business e i livelli di presentazione (ad esempio Visual C# o Visual Basic) e un linguaggio di query per interagire con il database (ad esempio Transact-SQL). Tale necessità non solo richiede una conoscenza approfondita di diversi linguaggi da parte degli sviluppatori, ma provoca anche problemi di mancata corrispondenza tra linguaggi nell'ambiente di sviluppo. Ad esempio, in un'applicazione che usa un'API di accesso ai dati per eseguire una query su un database la query viene specificata come valore letterale stringa racchiuso tra virgolette. Tale stringa di query è tuttavia illeggibile per il compilatore e non è possibile eseguire su di essa un controllo per verificare la presenza di errori, ad esempio l'uso di sintassi non valida o l'effettiva esistenza delle colonne o delle righe cui fa riferimento. Non viene eseguito il controllo dei tipi dei parametri della query, né è disponibile il supporto per IntelliSense.

Language Integrated Query (LINQ) consente agli sviluppatori di formare query basate su set nel codice dell'applicazione, senza dover usare un linguaggio di query diverso. È possibile scrivere query LINQ su diverse origini dati enumerabili (ovvero origini dati che implementano l'interfaccia IEnumerable), ad esempio strutture dei dati in memoria, documenti XML, database SQL e oggetti DataSet. Sebbene queste origini dati enumerabili vengono implementate in modi diversi, espongono tutte la stessa sintassi e gli stessi costrutti di linguaggio. Poiché è possibile formare query nel linguaggio di programmazione stesso, non è necessario usare un altro linguaggio di query incorporato sotto forma di valori letterali stringa che il compilatore non è in grado di riconoscere o verificare. L'integrazione delle query nel linguaggio di programmazione consente anche ai programmatori di Visual Studio di essere più produttivi fornendo il controllo del tipo e della sintassi in fase di compilazione e IntelliSense. Queste funzionalità riducono l'esigenza di debug e correzione degli errori delle query.

Il trasferimento di dati da tabelle SQL in oggetti in memoria è un'operazione spesso laboriosa e soggetta a errori. Il provider LINQ implementato da LINQ to DataSet e LINQ to SQL converte i dati di origine in raccolte di oggetti basate su IEnumerable. Il programmatore visualizza sempre i dati sotto forma di una raccolta IEnumerable, sia quando si esegue una query che quando si effettua un aggiornamento. Per la scrittura di query da eseguire su tali raccolte, viene fornito il supporto per IntelliSense.

Esistono tre tecnologie LINQ (Language-Integrated Query) separate ADO.NET: LINQ to DataSet, LINQ to SQL e LINQ to Entities. LINQ to DataSet offre un supporto più completo e ottimizzato per l'esecuzione di query su DataSet e LINQ to SQL consente di eseguire query direttamente sugli schemi di database di SQL Server e LINQ to Entities consente di eseguire query su Entity Data Model.

Nel diagramma seguente viene fornita una panoramica della correlazione tra le tecnologie LINQ ADO.NET, i linguaggi di programmazione di alto livello e le origini dati con supporto LINQ.

LINQ to ADO.NET overview

Per altre informazioni su LINQ, vedere Language Integrated Query (LINQ).

Le sezioni seguenti forniscono altre informazioni su LINQ to DataSet, LINQ to SQL e LINQ to Entities.

LINQ to DataSet

DataSet rappresenta un elemento chiave del modello di programmazione disconnesso su cui si basa ADO.NET ed è ampiamente usato. LINQ to DataSet consente agli sviluppatori di compilare funzionalità di query più complesse in DataSet usando lo stesso meccanismo di formulazione delle query disponibile per molte altre origini dati. Per altre informazioni, vedere LINQ to DataSet.

LINQ to SQL

LINQ to SQL è uno strumento utile per gli sviluppatori che non necessitano del mapping a un modello concettuale. Usando LINQ to SQL, è possibile usare il modello di programmazione LINQ direttamente sullo schema del database esistente. LINQ to SQL consente agli sviluppatori di generare classi .NET Framework che rappresentano i dati. Anziché eseguire il mapping a un modello di dati concettuale, tali classi generate vengono mappate direttamente a tabelle di database, visualizzazioni, stored procedure e funzioni definite dall'utente.

Con LINQ to SQL gli sviluppatori possono scrivere il codice direttamente nello schema di archiviazione usando lo stesso modello di programmazione LINQ delle raccolte in memoria e di DataSet, oltre ad altre origini dati, quali XML. Per altre informazioni, vedere LINQ to SQL.

LINQ to Entities

La maggior parte delle applicazioni viene attualmente scritta basandosi su database relazionali. A un certo punto è necessario che queste applicazioni interagiscano con i dati rappresentati in forma relazionale. Gli schemi di database non costituiscono sempre la soluzione ideale per la compilazione di applicazioni e i modelli concettuali di applicazione non corrispondono ai modelli logici di database. Entity Data Model è un modello di dati concettuale che può essere usato per modellare i dati di un dominio particolare in modo che le applicazioni possano interagire con i dati come oggetti. Per altre informazioni vedere Entity Framework ADO.NET.

Tramite Entity Data Model, i dati relazionali vengono esposti come oggetti nell'ambiente .NET. Ciò rende il livello di oggetto una destinazione ideale per il supporto di LINQ, consentendo agli sviluppatori di formulare query sul database a partire dal linguaggio usato per compilare la logica di business. Questa funzionalità è nota come LINQ to Entities. Per altre informazioni, vedere LINQ to Entities.

Vedi anche