Alberi di espressioni nei provider LINQ
Scopra come i provider traducono le espressioni in query.
Alberi di espressioni nei provider LINQ è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Perché LINQ ha bisogno degli alberi delle espressioni
LINQ ha due modalità. IEnumerable<T> esegue le lambda in memoria. IQueryable<T> le riceve come alberi delle espressioni, così un provider può tradurle in un altro linguaggio, ad esempio SQL.
IEnumerable e IQueryable a confronto
La differenza risiede nel tipo del parametro: IEnumerable.Where accetta Func<T,bool> (compilato), mentre IQueryable.Where accetta Expression<Func<T,bool>> (un albero).
using System;
using System.Linq;
using System.Linq.Expressions;
int[] nums = { 1, 2, 3, 4 };
// IEnumerable path: lambda is a compiled delegate
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(",", evens)); // 2,4La query rimane costituita da dati
Con IQueryable, la lambda viene acquisita come albero delle espressioni e non viene ancora eseguita. Il provider esamina l'albero per creare una query.
using System;
using System.Linq;
using System.Linq.Expressions;
IQueryable<int> q = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
var filtered = q.Where(n => n > 2);
Console.WriteLine(filtered.Expression.NodeType); // Call (a method-call tree)Ispezionare un'espressione di query
La proprietà Expression di una queryable espone l'albero che il provider tradurrà.
using System;
using System.Linq;
var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // TrueTraduzione, non esecuzione
Un provider come Entity Framework attraversa l'albero e genera SQL, ad esempio WHERE Age > 18. Il predicato C# non viene mai eseguito sul client: se ne occupa il database.
Il ruolo di IQueryProvider
IQueryable contiene un IQueryProvider. Quando si enumera la query, il provider riceve l'albero delle espressioni e decide come eseguirlo.
using System;
using System.Linq;
var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)Esecuzione posticipata
L'albero viene tradotto ed eseguito solo quando lo si enumera, ad esempio con ToList o foreach. Fino a quel momento è costituito da dati puri che è possibile continuare a comporre.
using System;
using System.Linq;
var q = new[] { 1, 2, 3, 4 }.AsQueryable()
.Where(n => n > 1)
.Select(n => n * 10);
// nothing has run yet; now force it:
Console.WriteLine(string.Join(",", q.ToList())); // 20,30,40Comporre query
Poiché ogni operatore aggiunge elementi all'albero delle espressioni, è possibile creare una query per fasi e il provider la vedrà nella sua interezza al momento dell'esecuzione.
using System;
using System.Linq;
var baseQuery = new[] { 5, 15, 25, 35 }.AsQueryable();
var q = baseQuery.Where(n => n > 10);
q = q.Where(n => n < 30); // composed: 10 < n < 30
Console.WriteLine(string.Join(",", q.ToList())); // 15,25Cosa non può essere tradotto
I provider possono tradurre solo le operazioni che comprendono. Un predicato che chiama un metodo C# arbitrario può generare un'eccezione durante l'esecuzione, perché non esiste un equivalente SQL.
Scrivere il proprio provider
I provider personalizzati implementano IQueryProvider e usano un ExpressionVisitor per attraversare l'albero e tradurre ogni nodo nel linguaggio di query di destinazione.
Mettere tutto insieme
Questo mostra l'idea fondamentale: la stessa lambda è un delegato per IEnumerable, ma un albero per IQueryable, rendendo possibile la traduzione.
using System;
using System.Linq;
using System.Linq.Expressions;
Expression<Func<int, bool>> predicate = n => n > 2;
var data = new[] { 1, 2, 3, 4 };
// IEnumerable needs a delegate:
Console.WriteLine(string.Join(",", data.Where(predicate.Compile()))); // 3,4
// IQueryable accepts the tree directly:
Console.WriteLine(string.Join(",", data.AsQueryable().Where(predicate))); // 3,4Verifica rapida
Verifichi il ruolo degli alberi delle espressioni nei provider LINQ.
Riepilogo
Ha imparato come i provider LINQ usano gli alberi delle espressioni.
IEnumerableusaFunccompilati;IQueryableusa alberiExpression<Func>.- I provider traducono l'albero, ad esempio in SQL, invece di eseguirlo.
- L'esecuzione viene posticipata fino all'enumerazione.
- Funzionano solo le operazioni traducibili; i metodi arbitrari possono causare errori.
Domande Frequenti
La lezione «Alberi di espressioni nei provider LINQ» è gratuita?
Sì — il testo completo di «Alberi di espressioni nei provider LINQ» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Alberi di espressioni nei provider LINQ»?
Scopra come i provider traducono le espressioni in query. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Alberi di espressioni nei provider LINQ»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Cosa sono gli alberi di espressioni
- Creazione manuale delle espressioni
- Compilazione ed esecuzione delle espressioni
- Alberi di espressioni nei provider LINQ