Domanda

LINQ è una nuova funzionalità di .NET 4.0, non supportata nelle versioni precedenti come .NET 3.5? A cosa serve? Sembra essere in grado di costruire alberi delle espressioni. Che cos'è un albero delle espressioni, in realtà? LINQ è in grado di estrarre informazioni come classe, metodo e campo da un file C #?

Qualcuno può fornirmi un pezzo di codice funzionante per dimostrare cosa LINQ può fare?

È stato utile?

Soluzione

LINQ è una funzionalità .NET 3.5 con built-in supporto linguistico da C # 3.0 e Visual Basic 2008. Ci sono molti esempi su MSDN .

Altri suggerimenti

Linq è stato aggiunto in .Net 3.5 (e aggiunto al compilatore c # 3.0 e in forma leggermente limitata al compilatore VB.net nella stessa versione)

In è una query integrata nella lingua, sebbene copra molte aggiunte complesse sia alla lingua che al runtime al fine di ottenere ciò che sono utili di per sé.

La funzionalità Expression è semplicemente la capacità di un programma, in fase di esecuzione, ispezionare la sintassi astratta di alcuni costrutti di codice passati. Questi sono chiamati lambda. E sono, in sostanza, un modo per scrivere funzioni anonime più facilmente, rendendo più semplice l'introspezione in fase di esecuzione della loro struttura.

La funzionalità "simile a SQL" a cui Linq è strettamente associato (sebbene non l'unico) viene chiamata Linq a SQL dove da qualcosa del genere:

from f in Foo where s.Blah == "wibble" select f.Wobble;

viene compilato in una rappresentazione di questa query, anziché semplicemente codificare per eseguire la query. La parte che lo rende linq in sql è il 'backend' che lo converte in sql. Per questo l'espressione viene tradotta in istruzioni sql server per eseguire la query su un database collegato con mappatura da righe a oggetti .net e conversione della logica c # in equivalenti clausole where. Potresti applicare esattamente lo stesso codice se Foo fosse una raccolta di semplici oggetti .net (a quel punto è & Quot; Linq in oggetti & Quot;) la conversione dell'espressione sarebbe quindi diretta in codice .Net .

Il lambda sopra scritto in modo integrato nella lingua è in realtà l'equivalente di:

Foo.Where (f = > f.Blah == " wibble) .Seleziona (f = > f.Wobble);

Dove Foo è una raccolta tipizzata. Per i database le classi sono sintetizzate per rappresentare i valori nel database per consentire sia la compilazione sia per consentire i valori di sgancio circolare dalle aree sql alle aree .net e viceversa.

L'aspetto critico della parte Lingua integrata di Linq è che i costrutti di lingua risultanti sono parti di prima classe del codice risultante. Invece di creare semplicemente una funzione, forniscono il modo in cui la funzione è stata costruita (come espressione) in modo che altri aspetti del programma possano manipolarla.

I consumatori di questa funzionalità possono semplicemente scegliere di eseguirla (eseguire la funzione in cui è compilata la lambda) o di chiedere l'espressione che la descrive e quindi fare qualcosa di diverso con essa.

Molti aspetti di ciò che lo rende possibile sono posti tra " Linq " banner nonostante non sia proprio Linq.
Ad esempio i tipi anonimi sono necessari per un facile utilizzo di projection (scelta di un sottoinsieme delle possibili proprietà) ma i tipi anonimi possono essere utilizzati anche al di fuori di Linq.

Linq, specialmente tramite lambdas (che rende molto leggera la scrittura di delegati anonimi in termini di sintassi) ha portato ad un aumento delle capacità funzionali di c #. questo è rafforzato dai metodi di estensione su IEnumerable<T> come Select (), corrispondente a map in molte lingue di funzioni e Where () corrispondente a filter. Come i tipi anonimi, questo non è di per sé & Quot; Linq & Quot; sebbene sia visto da molti come un effetto fortemente benefico sullo sviluppo di c # (questa non è una visione universale ma è ampiamente diffusa).

Le espressioni sono un argomento più avanzato e minimaleNon è assolutamente necessario per usare linq, anche se alcuni "trucchi" sono possibili usandoli. In generale ti interesseresti alle espressioni solo se stavi tentando di scrivere provider linq che è codice per prendere un'espressione piuttosto che solo una funzione e usarla per fare qualcosa di diverso da quello che farebbe la normale funzione, come parlare con un'origine dati esterna .

Altri usi sarebbero quando si desidera ottenere alcuni metadati su ciò che sta facendo l'interno della funzione, forse quindi compilare l'espressione (risultante in un delegato che ti permetterà di eseguire l'espressione come funzione) e fare qualcosa con esso o semplicemente guardando i metadati degli oggetti per fare il codice riflettente che è tempo di compilazione verificato come questa risposta mostra .

Un'area di questa domanda che non è stata ancora trattata sono gli alberi delle espressioni. È disponibile un ottimo articolo sugli alberi delle espressioni (e sull'espressione lambda) qui .

L'altra cosa importante da evidenziare sugli alberi delle espressioni è che costruendo un albero delle espressioni per definire ciò che stai per fare , non devi effettivamente Fai qualcosa. Mi riferisco all'esecuzione differita.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

LINQ è stato introdotto con .NET 3.5. Questo sito contiene molti esempi.

Anche questo è trattato in modo piuttosto esteso qui su SO .

System.Linq.Expressions è per la creazione manuale (o la generazione di macchine) di alberi delle espressioni. Ho la sensazione che, data la complessità della costruzione di funzionalità più complicate, questo spazio dei nomi sia sottoutilizzato. Tuttavia è estremamente potente. Ad esempio, uno dei miei colleghi ha recentemente implementato un albero delle espressioni che può ridimensionare automaticamente qualsiasi oggetto LINQ to SQL utilizzando una funzione di densità cumulativa. Ogni colonna ottiene il proprio albero che viene compilato in modo che sia veloce. Ho creato un compilatore specializzato che li utilizza ampiamente per implementare funzionalità di base e incollare insieme il resto del codice generato.

Si prega di consultare questo post sul blog per ulteriori informazioni e idee.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top