Sobes.tech
Middle

Was ist IQueryable im Kontext von C#?

sobes.tech KI

Antwort von AI

IQueryable<T> ist eine Schnittstelle in LINQ, die es ermöglicht, Abfragen an eine Datenquelle zu erstellen und auszuführen, die verzögerte Auswertung und die Fähigkeit zur Erstellung eines Ausdruckbaums unterstützt.

Wichtige Merkmale:

  • Verzögerte Auswertung: Die Abfrage wird nicht sofort beim Erstellen ausgeführt, sondern nur bei Bedarf (z.B. beim Iterieren über die Sammlung oder beim Aufruf von ToList(), ToArray()).
  • Ausdruckbaum: Die Abfrage wird in Form eines Ausdruckbaums (Expression<Func<T>>) dargestellt, der analysiert und in etwas umgewandelt werden kann, das für die Datenquelle verständlich ist (z.B. eine SQL-Abfrage für eine Datenbank).
  • Filtern und Projizieren auf der Datenquellenseite: Dank des Ausdruckbaums können Filteroperationen (Where), Sortierungen (OrderBy) und Projektionen (Select) auf der Seite der Datenquelle ausgeführt werden, was die Leistung erheblich verbessert, insbesondere bei der Arbeit mit großen Datenmengen.

Unterschiede zu IEnumerable<T>:

Merkmal IEnumerable<T> IQueryable<T>
Auswertung Sofortig/Verzögert (abhängig von der Quelle) Verzögert
Datenextraktion Die gesamte Sammlung kann in den Speicher geladen werden Es werden nur die benötigten Daten nach der Ausführung geladen
Wo Filterung/Projektion Im Speicher der Anwendung Auf der Seite der Datenquelle
Basis Sammlungen im Speicher, Arrays Datenquellen (Datenbanken, Web-Services usw.)
Unterstützung von Ausdrücken Nein (verwendet Delegaten Func<T>) Ja (verwendet Ausdruckbäume Expression<Func<T>>)

Beispiel für die Verwendung:

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

// Angenommen, dies ist eine Datenquelle, die IQueryable unterstützt
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 einer realen Situation wäre dies eine Datenbankabfrage oder eine andere Quelle
        return people.AsQueryable();
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// Verwendung
public class Program
{
    public static void Main(string[] args)
    {
        DataSource dataSource = new DataSource();

        // Erstellen einer Abfrage mit IQueryable - die Abfrage ist noch nicht ausgeführt
        IQueryable<Person> query = dataSource.GetPeople()
            .Where(p => p.Age > 28)
            .OrderBy(p => p.Name);

        // Ausführen der Abfrage beim Iterieren
        foreach (var person in query)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }

        // Ausführen der Abfrage beim Umwandeln in eine Liste
        List<Person> seniors = query.ToList();
    }
}