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