Che cos'è LINQ? So che è per i database, ma cosa fa?
Che cos'è LINQ? So che è per i database, ma cosa fa?
Risposte:
LINQ è l' acronimo di Language Integrated Query .
Invece di scrivere YAQL (Yet Another Query Language), gli sviluppatori del linguaggio Microsoft hanno fornito un modo per esprimere le query direttamente nelle loro lingue (come C # e Visual Basic). Le tecniche per formare queste query non si basano sui dettagli di implementazione della cosa da interrogare, quindi è possibile scrivere query valide su molti target (database, oggetti in memoria, XML) praticamente senza considerare il modo in cui il la query verrà eseguita.
Iniziamo questa esplorazione con le parti appartenenti a .NET Framework (3.5).
LINQ To Objects: esamina System.Linq.Enumerable per i metodi di query. Questi target IEnumerable<T>
, consentendo a qualsiasi raccolta loopable tipizzata di essere interrogata in modo sicuro. Queste query si basano su metodi .NET compilati, non su espressioni.
LINQ To Anything: esaminare System.Linq.Queryable per alcuni metodi di query. Questi obiettivi IQueryable<T>
, che consentono la costruzione di alberi delle espressioni che possono essere tradotti dall'implementazione sottostante.
Alberi delle espressioni: esamina lo spazio dei nomi System.Linq.Expressions . Questo è il codice come dati. In pratica, dovresti essere a conoscenza di queste cose, ma non hai davvero bisogno di scrivere codice contro questi tipi. Le funzionalità del linguaggio (come le espressioni lambda) possono consentire di utilizzare varie mani brevi per evitare di gestire direttamente questi tipi.
LINQ To SQL: esamina lo spazio dei nomi System.Data.Linq . Soprattutto notare il DataContext
. Questa è una tecnologia DataAccess sviluppata dal team C #. Funziona e basta.
LINQ To Entities: esamina lo spazio dei nomi System.Data.Objects . Soprattutto notare il ObjectContext
. Questa è una tecnologia DataAccess sviluppata dal team ADO.NET. È complesso, potente e più difficile da usare rispetto a LINQ To SQL.
LINQ To XML: esamina lo spazio dei nomi System.Xml.Linq . In sostanza, le persone non erano soddisfatte delle cose System.Xml
. Quindi Microsoft lo ha riscritto e ha approfittato della riscrittura per introdurre alcuni metodi che semplificano l'uso di LINQ To Objects su XML.
Alcuni simpatici tipi di aiuto, come Func e Action . Questi tipi sono delegati con supporto generico. Sono finiti i giorni in cui si dichiaravano i propri tipi di delegato personalizzati (e non intercambiabili).
Tutto quanto sopra fa parte di .NET Framework ed è disponibile da qualsiasi linguaggio .NET (VB.NET, C #, IronPython, COBOL .NET ecc.).
Ok, passiamo alle funzioni linguistiche. Seguirò C #, poiché è quello che conosco meglio. VB.NET ha anche avuto diversi miglioramenti simili (e un paio che C # non ha ottenuto - letterali XML). Questa è una lista breve e incompleta.
Metodi di estensione: ciò consente di "aggiungere" un metodo da digitare. Il metodo è in realtà un metodo statico a cui viene passata un'istanza del tipo ed è limitato al contratto pubblico del tipo, ma è molto utile per aggiungere metodi a tipi che non si controllano (stringa) o aggiungere (completamente implementati ) metodi di supporto alle interfacce.
Sintassi di comprensione della query: consente di scrivere in una struttura simile a SQL. Tutto questo materiale viene tradotto nei metodi su System.Linq.Queryable o System.Linq.Enumerable (a seconda del tipo di myCustomers). È completamente opzionale e puoi usare LINQ senza di esso. Un vantaggio di questo stile di dichiarazione di query è che le variabili di intervallo hanno un ambito: non è necessario che vengano nuovamente dichiarate per ogni clausola.
IEnumerable<string> result =
from c in myCustomers
where c.Name.StartsWith("B")
select c.Name;
Espressioni lambda - Questa è una scorciatoia per specificare un metodo. Il compilatore C # tradurrà ciascuno in un metodo anonimo o un vero System.Linq.Expressions.Expression
. Devi davvero capire questi per usare bene Linq. Vi sono tre parti: un elenco di parametri, una freccia e un corpo del metodo.
IEnumerable<string> 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 nomina quando li rende. Ma quei nomi vengono creati in fase di compilazione, 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 da poter capire il tipo per te. È possibile indicare al compilatore di farlo utilizzando la parola chiave var. La digitazione 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<string>
var names = myCustomers.Select(c => c.Name);
LINQ (Language INtegrated Query) può riferirsi a:
una libreria per la raccolta e la manipolazione di iteratori 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 sintassi astratti (System.Linq.Expressions)
un'estensione della sintassi in varie lingue per fornire una sintassi più simile a SQL per l'elaborazione delle raccolte, una notazione più compatta per le funzioni anonime e un meccanismo per introdurre funzioni di supporto statiche 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 essa, o occasionalmente i fornitori di dati compatibili stessi
I componenti possono essere utilizzati separatamente o combinati.
In poche parole, LINQ (Language Integrated Query) consente di scrivere query direttamente nel codice. Tali query possono essere su database relazionali, ma anche su oggetti contenitore XML o in memoria, come matrici ed elenchi. 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 altri archivi di dati, XML ecc.) Usando un linguaggio di query simile a SQL ma che può essere compilato all'interno di un'applicazione .NET.
From Where Select, etc.
- cioè dovrebbe essere scritto nel modo in cui il Set di risultati è effettivamente formato
LINQ è l'acronimo di Language Integrated Query ed è un modo per fornire un meccanismo di "query" per scopi generici nel CLR.
Al livello più elementare, questo consiste in una serie di metodi su IEnumerable <T> - ad es., Seleziona, Somma, Dove - che possono essere utilizzati per restrizioni, proiezioni, ecc. [1]
Per andare un po 'oltre, LINQ definisce anche un nuovo modello di provider LINQ che può prendere un albero di espressioni e usarlo per eseguire query "native" su un'origine dati al di fuori del CLR - ad esempio, LINQ to SQL, LINQ to XML, LINQ a NHibernate, ecc.
C # e VB.NET hanno anche definito una sintassi della query che consente di scrivere query fortemente tipizzate in linea (che assomigliano molto a SQL), che il compilatore traduce quindi nelle equivalenti chiamate IEnumerable <T>.
Per me, la cosa più interessante di LINQ è che tutte le funzionalità di C # e VB.NET necessarie per supportarlo sono utili di per sé. Metodi di estensione, tipi anonimi, espressioni lambda e tipizzazione implicita erano tutti necessari per supportare LINQ - ma tendiamo a usare quelle funzionalità al di fuori di un contesto LINQ puro.
[1] Questi sono termini relazionali, i programmatori funzionali preferirebbero probabilmente Mappa, Riduci, Piega, ecc.
LINQ è una tecnologia per estrarre dati usando un linguaggio derivato dal linguaggio di programmazione C #. Mentre deve molto alla progettazione funzionale di SQL, è fondamentalmente il suo linguaggio di query dei dati. Funziona attraverso un ampio spettro di origini 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 quella che viene spesso definita una "mancata corrispondenza di impedenza" tra la programmazione SQL e la programmazione C # / VB.
Per una discussione su LINQ e i suoi limiti, ti consigliamo di dare un'occhiata a questa domanda correlata: LINQ to SQL non perde il punto?
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
"Il progetto LINQ è un nome in codice per un set di estensioni a .NET Framework che comprende operazioni di query, set e trasformazione integrate nel linguaggio. Estende C # e Visual Basic con la sintassi del linguaggio nativo per le query e fornisce librerie di classi per trarre vantaggio da queste capacità ".