Middle
¿Qué es IQueryable en el contexto de C#?
sobes.tech AI
Respuesta de la IA
IQueryable<T> es una interfaz en LINQ que permite construir y ejecutar consultas a una fuente de datos que soporta evaluación diferida y la capacidad de construir un árbol de expresiones.
Características clave:
- Evaluación diferida: La consulta no se ejecuta inmediatamente al construirla, sino solo cuando es necesario obtener los resultados (por ejemplo, al iterar sobre la colección o llamar a
ToList(),ToArray()). - Árbol de expresiones: La consulta se representa en forma de árbol de expresiones (
Expression<Func<T>>), que puede ser analizado y transformado en algo comprensible para la fuente de datos (por ejemplo, una consulta SQL para una base de datos). - Filtrado y proyección en el lado de la fuente de datos: Gracias al árbol de expresiones, las operaciones de filtrado (
Where), ordenamiento (OrderBy) y proyección (Select) pueden realizarse en el lado de la fuente de datos, lo que aumenta significativamente el rendimiento, especialmente al trabajar con grandes volúmenes de datos.
Diferencias con IEnumerable<T>:
| Característica | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Evaluación | Inmediata/Retardada (depende de la fuente) | Diferida |
| Extracción de datos | Toda la colección puede cargarse en memoria | Solo se cargan los datos necesarios después de la ejecución |
| Dónde se realiza el filtrado/proyección | En memoria de la aplicación | En el lado de la fuente de datos |
| Base | Colecciones en memoria, arreglos | Fuentes de datos (bases de datos, servicios web, etc.) |
| Soporte de expresiones | No (usa delegados Func<T>) |
Sí (usa árboles de expresiones Expression<Func<T>>) |
Ejemplo de uso:
using System.Linq;
using System.Collections.Generic;
// Supongamos que esta es una fuente de datos que soporta IQueryable
public class DataSource
{
private List<Person> people = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
public IQueryable<Person> GetPeople()
{
// En una situación real, esto sería una consulta a una base de datos u otra fuente
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Uso
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Crear una consulta con IQueryable - la consulta aún no se ejecuta
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Ejecutar la consulta al iterar
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Ejecutar la consulta al convertir a lista
List<Person> seniors = query.ToList();
}
}