Middle
Wat is IQueryable in de context van C#?
sobes.tech AI
Antwoord van AI
IQueryable<T> is een interface in LINQ waarmee je queries kunt bouwen en uitvoeren op een gegevensbron die lazy evaluation ondersteunt en de mogelijkheid om een expressiebomen te bouwen.
Belangrijkste kenmerken:
- Lazy evaluation: De query wordt niet direct uitgevoerd bij het bouwen, maar alleen wanneer het nodig is om de resultaten te verkrijgen (bijvoorbeeld bij iteratie over de collectie of het aanroepen van
ToList(),ToArray()). - Expressiebomen: De query wordt weergegeven als een expressiebomen (
Expression<Func<T>>), die geanalyseerd en omgezet kan worden in iets dat de gegevensbron begrijpt (bijvoorbeeld een SQL-query voor een database). - Filtering en projectie aan de zijde van de gegevensbron: Dankzij de expressiebomen kunnen filter (
Where), sorteer (OrderBy) en projectie (Select) operaties aan de zijde van de gegevensbron worden uitgevoerd, wat de prestaties aanzienlijk verbetert, vooral bij werken met grote hoeveelheden data.
Verschillen met IEnumerable<T>:
| Kenmerk | IEnumerable<T> |
IQueryable<T> |
|---|---|---|
| Evaluatie | Direct/uitgesteld (afhankelijk van de bron) | Uitgesteld |
| Gegevens ophalen | De hele collectie kan in het geheugen geladen worden | Alleen de benodigde gegevens worden na uitvoering geladen |
| Waar wordt gefilterd/projection uitgevoerd | In het geheugen van de applicatie | Aan de zijde van de gegevensbron |
| Basis | Collecties in geheugen, arrays | Gegevensbronnen (databases, webservices, etc.) |
| Ondersteuning voor expressies | Nee (gebruikt delegates Func<T>) |
Ja (gebruikt expressiebomen Expression<Func<T>>) |
Voorbeeld van gebruik:
using System.Linq;
using System.Collections.Generic;
// Stel dat dit een gegevensbron is die IQueryable ondersteunt
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()
{
// In een echte situatie zou dit een databasequery of een andere bron zijn
return people.AsQueryable();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Gebruik
public class Program
{
public static void Main(string[] args)
{
DataSource dataSource = new DataSource();
// Maak een query met IQueryable - de query is nog niet uitgevoerd
IQueryable<Person> query = dataSource.GetPeople()
.Where(p => p.Age > 28)
.OrderBy(p => p.Name);
// Voer de query uit tijdens iteratie
foreach (var person in query)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Voer de query uit bij het converteren naar een lijst
List<Person> seniors = query.ToList();
}
}