0Pricing
C# Academy · Lezione

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,4

La 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")); // True

Traduzione, 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,40

Comporre 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,25

Cosa 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,4

Verifica rapida

Verifichi il ruolo degli alberi delle espressioni nei provider LINQ.

Riepilogo

Ha imparato come i provider LINQ usano gli alberi delle espressioni.

  • IEnumerable usa Func compilati; IQueryable usa alberi Expression<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

  1. Cosa sono gli alberi di espressioni
  2. Creazione manuale delle espressioni
  3. Compilazione ed esecuzione delle espressioni
  4. Alberi di espressioni nei provider LINQ
← Torna a C# Academy