0Pricing
C# Academy · Lección

Árboles de expresiones en proveedores LINQ

Observe cómo los proveedores traducen expresiones a consultas.

Árboles de expresiones en proveedores LINQ es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Por qué LINQ necesita árboles de expresiones

LINQ tiene dos variantes. IEnumerable<T> ejecuta lambdas en memoria. IQueryable<T> las recibe como árboles de expresiones para que un proveedor pueda traducirlas a otro lenguaje, como SQL.

IEnumerable frente a IQueryable

La diferencia está en el tipo del parámetro: IEnumerable.Where recibe Func<T,bool> (compilado), mientras que IQueryable.Where recibe Expression<Func<T,bool>> (un árbol).

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 consulta permanece como datos

Con IQueryable, la lambda se captura como un árbol de expresiones y todavía no se ejecuta. El proveedor inspecciona el árbol para construir una consulta.

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)

Inspeccionar una expresión de consulta

La propiedad Expression de un objeto consultable expone el árbol que traducirá el proveedor.

using System;
using System.Linq;

var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // True

Traducción, no ejecución

Un proveedor como Entity Framework recorre el árbol y genera SQL como WHERE Age > 18. El predicado de C# nunca se ejecuta en el cliente; la base de datos realiza el trabajo.

El papel de IQueryProvider

IQueryable contiene un IQueryProvider. Al enumerar la consulta, el proveedor recibe el árbol de expresiones y decide cómo ejecutarlo.

using System;
using System.Linq;

var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)

Ejecución diferida

El árbol solo se traduce y ejecuta cuando se enumera (por ejemplo, mediante ToList o foreach). Hasta entonces, son datos puros que puede seguir componiendo.

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

Componer consultas

Como cada operador se añade al árbol de expresiones, puede construir una consulta por etapas y el proveedor verá el conjunto completo en el momento de la ejecución.

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

Lo que no se puede traducir

Los proveedores solo pueden traducir las operaciones que entienden. Un predicado que llame a un método de C# arbitrario puede producir una excepción durante la ejecución porque no existe un equivalente en SQL.

Escribir su propio proveedor

Los proveedores personalizados implementan IQueryProvider y utilizan un ExpressionVisitor para recorrer el árbol y traducir cada nodo al lenguaje de consulta de destino.

Integración

Esto muestra la idea clave: la misma lambda es un delegado para IEnumerable, pero un árbol para IQueryable, lo que permite traducirla.

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

Comprobación rápida

Confirme el papel que desempeñan los árboles de expresiones en los proveedores de LINQ.

Resumen

Ha aprendido cómo utilizan los proveedores de LINQ los árboles de expresiones.

  • IEnumerable utiliza Func compilados; IQueryable utiliza árboles Expression<Func>.
  • Los proveedores traducen el árbol (por ejemplo, a SQL) en lugar de ejecutarlo.
  • La ejecución se difiere hasta la enumeración.
  • Solo funcionan las operaciones traducibles; los métodos arbitrarios pueden fallar.

Preguntas frecuentes

¿La lección «Árboles de expresiones en proveedores LINQ» es gratis?

Sí — el texto completo de «Árboles de expresiones en proveedores LINQ» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Árboles de expresiones en proveedores LINQ»?

Observe cómo los proveedores traducen expresiones a consultas. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Árboles de expresiones en proveedores LINQ»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Qué son los árboles de expresiones
  2. Construcción manual de expresiones
  3. Compilación y ejecución de expresiones
  4. Árboles de expresiones en proveedores LINQ
← Volver a C# Academy