Á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,4La 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")); // TrueTraducció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,40Componer 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,25Lo 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,4Comprobació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.
IEnumerableutilizaFunccompilados;IQueryableutiliza árbolesExpression<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
- Qué son los árboles de expresiones
- Construcción manual de expresiones
- Compilación y ejecución de expresiones
- Árboles de expresiones en proveedores LINQ