Cos’è LINQ e cosa fa?

Cos’è LINQ? So che è per i database, ma cosa fa?

LINQ è l’ acronimo di Language Integrated Query .

Invece di scrivere YAQL (Yet Another Query Language), gli sviluppatori di linguaggi Microsoft hanno fornito un modo per esprimere query direttamente nei loro linguaggi (come C # e Visual Basic). Le tecniche per la creazione di queste query non si basano sui dettagli dell’implementazione dell’object interrogato, in modo che tu possa scrivere query valide su molti target (database, oggetti in memoria, XML) senza praticamente considerare il modo sottostante in cui il la query verrà eseguita.

Iniziamo questa esplorazione con le parti che appartengono a .NET Framework (3.5).

  • LINQ agli oggetti: esaminare System.Linq.Enumerable per i metodi di query. Questi target IEnumerable consentono di interrogare in modo sicuro i tipi di raccolta loopable digitati. Queste query si basano su metodi .NET compilati, non su Espressioni.

  • LINQ a qualsiasi cosa: esaminare System.Linq.Queryable per alcuni metodi di query. Questi target IQueryable , consentendo la costruzione di Expression Trees che possono essere tradotti dall’implementazione sottostante.

  • Alberi di espressione: esaminare lo spazio dei nomi System.Linq.Expressions . Questo è il codice come dati. In pratica, dovresti essere consapevole di questa roba, ma non hai davvero bisogno di scrivere codice contro questi tipi. Le funzionalità linguistiche (come le espressioni lambda) possono consentire di utilizzare varie short-hands per evitare di affrontare direttamente questi tipi.

  • LINQ a SQL: esaminare lo spazio dei nomi System.Data.Linq . Soprattutto nota il DataContext . Questa è una tecnologia DataAccess creata dal team C #. Funziona e basta.

  • LINQ alle entity framework: esaminare lo spazio dei nomi System.Data.Objects . Soprattutto nota l’ ObjectContext . Questa è una tecnologia DataAccess creata dal team ADO.NET. È complesso, potente e più difficile da utilizzare rispetto a LINQ to SQL.

  • LINQ a XML: esaminare lo spazio dei nomi System.Xml.Linq . In sostanza, le persone non erano soddisfatte del materiale in System.Xml . Quindi Microsoft ha riscritto il documento e ha approfittato della riscrittura per introdurre alcuni metodi che rendono più semplice l’uso di LINQ to Objects contro XML.

  • Alcuni simpatici tipi di helper, come Func e Action . Questi tipi sono delegati con supporto generico. Sono finiti i giorni in cui dichiarare i propri tipi di delegati personalizzati (e non intercambiabili).

Tutto quanto sopra è parte di .NET Framework e disponibile da qualsiasi linguaggio .NET (VB.NET, C #, IronPython, COBOL .NET, ecc.).


Ok, sulle funzionalità linguistiche. Ho intenzione di attenersi a C #, poiché è quello che so meglio. VB.NET ha avuto anche diversi miglioramenti simili (e un paio che C # non ha ottenuto – letterali XML). Questa è una lista breve e incompleta.

  • Metodi di estensione: consente di “aggiungere” un metodo per digitare. Il metodo è in realtà un metodo statico che viene passato un’istanza del tipo ed è limitato al contratto pubblico del tipo, ma è molto utile per l’aggiunta di metodi a tipi non controllati (stringa) o aggiunti (completamente implementati ) metodi di supporto alle interfacce.

  • Sintassi di comprensione delle query: consente di scrivere in una struttura simile a SQL. Tutto questo viene tradotto nei metodi su System.Linq.Queryable o System.Linq.Enumerable (a seconda del tipo di myCustomers). È completamente opzionale e puoi usare LINQ bene senza di esso. Uno dei vantaggi di questo stile di dichiarazione di query è che le variabili dell’intervallo sono scope: non è necessario che vengano dichiarate nuovamente per ogni clausola.

     IEnumerable result = from c in myCustomers where c.Name.StartsWith("B") select c.Name; 
  • Lambda Expressions – Questa è una scorciatoia per specificare un metodo. Il compilatore C # tradurrà ciascuno in un metodo anonimo o in un vero System.Linq.Expressions.Expression . Hai davvero bisogno di capire questi per usare bene Linq. Ci sono tre parti: un elenco di parametri, una freccia e un corpo del metodo.

     IEnumerable result = myCustomers .Where(c => c.Name.StartsWith("B")) .Select(c => c.Name);` 
  • Tipi anonimi – A volte il compilatore ha informazioni sufficienti per creare un tipo per te. Questi tipi non sono veramente anonimi: il compilatore li chiama quando li fa. Ma quei nomi sono fatti in fase di compilazione, il che è troppo tardi perché uno sviluppatore possa usare quel nome in fase di progettazione.

     myCustomers.Select(c => new { Name = c.Name; Age = c.Age; }) 
  • Tipi impliciti – A volte il compilatore ha abbastanza informazioni da un’inizializzazione che può capire il tipo per te. Puoi istruire il compilatore a farlo usando la parola chiave var. La tipizzazione implicita è richiesta per dichiarare le variabili per i Tipi anonimi, poiché i programmatori non possono usare il nome di un tipo anonimo .

     // The compiler will determine that names is an IEnumerable var names = myCustomers.Select(c => c.Name); 

LINQ (Language Integrated Query) può riferirsi a:

  • una libreria per la raccolta e la manipolazione iteratrice che fa ampio uso di funzioni di ordine superiore come argomenti (System.Linq)

  • una libreria per il passaggio e la manipolazione di funzioni semplici come alberi di syntax astratti (System.Linq.Expressions)

  • un’estensione della syntax a vari linguaggi per fornire una syntax più simile a SQL per l’elaborazione di raccolte, una notazione più compatta per le funzioni anonime e un meccanismo per introdurre le funzioni di supporto statico sintatticamente indistinguibili dalle funzioni dei membri finali

  • una definizione di interfaccia a cui i fornitori di dati possono conformarsi per ricevere la struttura delle query e potenzialmente eseguire l’ottimizzazione su di essi, o occasionalmente i fornitori di dati compatibili stessi

I componenti possono essere utilizzati isolati o combinati.

In breve, LINQ (Language-Integrated Query) consente di scrivere query direttamente nel codice. Queste query possono essere su database relazionali, ma anche su oggetti contenitore XML o in memoria, come array e liste. Ulteriori informazioni sono disponibili nella libreria MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx

Cercherò una risposta semplice: LINQ è un modo per interrogare il tuo database (o altro archivio dati, XML, ecc.) Utilizzando un linguaggio di query simile a SQL ma che può essere compilato all’interno di un’applicazione .NET.

LINQ è l’acronimo di Language Integrated Query ed è un modo per fornire un meccanismo di “query” di interesse generale nel CLR.

Al suo livello più elementare, questo consiste in un insieme di metodi su IEnumerable – es., Select, Sum, Where – che può essere usato per restrizioni, proiezioni, ecc. [1]

Per approfondire ulteriormente, LINQ definisce anche un nuovo modello di provider LINQ che può utilizzare un albero di espressioni e utilizzarlo per eseguire query “native” su un’origine dati esterna al CLR, ad esempio LINQ su SQL, LINQ su XML, LINQ a NHibernate, ecc.

C # e VB.NET hanno anche definito una syntax di query che consente di scrivere query fortemente tipizzate in linea (che sembra molto simile a SQL), che il compilatore traduce poi nelle chiamate IEnumerable equivalenti.

Per me, la cosa più interessante di LINQ è che tutte le funzionalità C # e VB.NET necessarie per sostenerlo sono utili di per sé. I metodi di estensione, i tipi anonimi, le espressioni lambda e la digitazione implicita erano tutti necessari per supportare LINQ, ma tendiamo a utilizzare tali funzioni al di fuori di un puro contesto LINQ.

[1] Quelli sono termini relazionali, i programmatori funzionali preferirebbero probabilmente Map, Reduce, Fold, ecc.

LINQ è una tecnologia per estrarre dati utilizzando un linguaggio derivato dal linguaggio di programmazione C #. Mentre deve molto alla progettazione funzionale di SQL, è fondamentalmente il proprio linguaggio di interrogazione dei dati. Funziona su un ampio spettro di fonti di dati (database SQL, rappresentazioni in memoria, XML, ecc.). LINQ-To-SQL, in particolare, dovrebbe essere visto come un contrasto con l’uso tradizionale di SQL incorporato che soffre di quello che viene spesso definito come un “mismatch di impedenza” tra la programmazione SQL e la programmazione C # / VB.

Per una discussione su LINQ e sui suoi limiti, puoi dare un’occhiata a questa domanda correlata: LINQ to SQL non coglie il punto?

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

“Il progetto LINQ è un nome in codice per un insieme di estensioni di .NET Framework che comprendono operazioni integrate di query, set e trasformazione linguistiche. Estende C # e Visual Basic con la syntax del linguaggio nativo per le query e fornisce librerie di classi per sfruttare queste capacità. ”