Sobes.tech
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();
    }
}