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