Sobes.tech
Middle

O que é IQueryable no contexto do C#?

sobes.tech IA

Resposta da IA

IQueryable<T> é uma interface no LINQ que permite construir e executar consultas a uma fonte de dados que suporta avaliação diferida e a capacidade de construir uma árvore de expressões.

Características principais:

  • Avaliação diferida: A consulta não é executada imediatamente ao ser construída, mas apenas quando é necessário obter os resultados (por exemplo, ao iterar sobre a coleção ou chamar ToList(), ToArray()).
  • Árvore de expressões: A consulta é representada na forma de uma árvore de expressões (Expression<Func<T>>), que pode ser analisada e transformada em algo compreensível para a fonte de dados (por exemplo, uma consulta SQL para uma base de dados).
  • Filtragem e projeção no lado da fonte de dados: Graças à árvore de expressões, operações de filtragem (Where), ordenação (OrderBy) e projeção (Select) podem ser realizadas no lado da fonte de dados, o que aumenta significativamente o desempenho, especialmente ao trabalhar com grandes volumes de dados.

Diferenças para IEnumerable<T>:

Característica IEnumerable<T> IQueryable<T>
Avaliação Imediata/Retardada (depende da fonte) Diferida
Extração de dados Toda a coleção pode ser carregada na memória Apenas os dados necessários são carregados após a execução
Onde a filtragem/projeção ocorre Na memória da aplicação No lado da fonte de dados
Base Coleções na memória, arrays Fontes de dados (bancos de dados, serviços web, etc.)
Suporte a expressões Não (usa delegados Func<T>) Sim (usa árvores de expressões Expression<Func<T>>)

Exemplo de uso:

using System.Linq;
using System.Collections.Generic;

// Suponha que esta seja uma fonte de dados que suporta 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()
    {
        // Na situação real, isto seria uma consulta a uma base de dados ou outra fonte
        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();

        // Criar uma consulta com IQueryable - a consulta ainda não foi executada
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Executar a consulta ao iterar
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Executar a consulta ao converter para lista
        List<Person> seniors = query.ToList();
    }
}