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