0Pricing
C# Academy · Lektion

Expression Trees in LINQ-Providern

Sehen Sie, wie Provider Expressions in Abfragen übersetzen.

Expression Trees in LINQ-Providern ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum LINQ Ausdrucksbäume benötigt

LINQ gibt es in zwei Varianten. IEnumerable<T> führt Lambda-Ausdrücke im Speicher aus. IQueryable<T> erhält sie als Ausdrucksbäume, damit ein Provider sie in eine andere Sprache wie SQL übersetzen kann.

IEnumerable und IQueryable im Vergleich

Der Unterschied liegt im Parametertyp: IEnumerable.Where übernimmt Func<T,bool> (kompiliert), während IQueryable.Where Expression<Func<T,bool>> (einen Baum) übernimmt.

using System;
using System.Linq;
using System.Linq.Expressions;

int[] nums = { 1, 2, 3, 4 };
// IEnumerable path: lambda is a compiled delegate
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(",", evens)); // 2,4

Die Abfrage bleibt eine Datenstruktur

Bei IQueryable wird Ihr Lambda-Ausdruck als Ausdrucksbaum erfasst und noch nicht ausgeführt. Der Provider untersucht den Baum, um eine Abfrage zu erstellen.

using System;
using System.Linq;
using System.Linq.Expressions;

IQueryable<int> q = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
var filtered = q.Where(n => n > 2);
Console.WriteLine(filtered.Expression.NodeType); // Call (a method-call tree)

Einen Abfrageausdruck untersuchen

Die Eigenschaft Expression einer abfragbaren Quelle stellt den Baum bereit, den der Provider übersetzen wird.

using System;
using System.Linq;

var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // True

Übersetzung statt Ausführung

Ein Provider wie Entity Framework durchläuft den Baum und erzeugt SQL wie WHERE Age > 18. Ihr C#-Prädikat wird nicht auf dem Client ausgeführt; die Datenbank übernimmt die Arbeit.

Die Rolle von IQueryProvider

IQueryable enthält einen IQueryProvider. Wenn Sie die Abfrage aufzählen, erhält der Provider den Ausdrucksbaum und entscheidet, wie er ausgeführt wird.

using System;
using System.Linq;

var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)

Verzögerte Ausführung

Der Baum wird erst übersetzt und ausgeführt, wenn Sie ihn aufzählen, beispielsweise mit ToList oder foreach. Bis dahin handelt es sich um reine Daten, die Sie weiter zusammensetzen können.

using System;
using System.Linq;

var q = new[] { 1, 2, 3, 4 }.AsQueryable()
    .Where(n => n > 1)
    .Select(n => n * 10);
// nothing has run yet; now force it:
Console.WriteLine(string.Join(",", q.ToList())); // 20,30,40

Abfragen zusammensetzen

Da jeder Operator den Ausdrucksbaum erweitert, können Sie eine Abfrage schrittweise erstellen. Bei der Ausführung sieht der Provider das vollständige Ergebnis.

using System;
using System.Linq;

var baseQuery = new[] { 5, 15, 25, 35 }.AsQueryable();
var q = baseQuery.Where(n => n > 10);
q = q.Where(n => n < 30); // composed: 10 < n < 30
Console.WriteLine(string.Join(",", q.ToList())); // 15,25

Was nicht übersetzt werden kann

Provider können nur Operationen übersetzen, die sie verstehen. Ein Prädikat, das eine beliebige C#-Methode aufruft, kann bei der Ausführung eine Ausnahme auslösen, weil es dafür kein SQL-Gegenstück gibt.

Einen eigenen Provider schreiben

Benutzerdefinierte Provider implementieren IQueryProvider und verwenden einen ExpressionVisitor, um den Baum zu durchlaufen und jeden Knoten in ihre Zielsprache für Abfragen zu übersetzen.

Alles zusammenführen

Dies zeigt die zentrale Erkenntnis: Derselbe Lambda-Ausdruck ist für IEnumerable ein Delegate, für IQueryable jedoch ein Baum, der Übersetzungen ermöglicht.

using System;
using System.Linq;
using System.Linq.Expressions;

Expression<Func<int, bool>> predicate = n => n > 2;
var data = new[] { 1, 2, 3, 4 };
// IEnumerable needs a delegate:
Console.WriteLine(string.Join(",", data.Where(predicate.Compile()))); // 3,4
// IQueryable accepts the tree directly:
Console.WriteLine(string.Join(",", data.AsQueryable().Where(predicate))); // 3,4

Schnelltest

Überprüfen Sie, welche Rolle Ausdrucksbäume in LINQ-Providern spielen.

Zusammenfassung

Sie haben gelernt, wie LINQ-Provider Ausdrucksbäume verwenden.

  • IEnumerable verwendet ein kompiliertes Func; IQueryable verwendet Expression<Func>-Bäume.
  • Provider übersetzen den Baum, beispielsweise in SQL, statt ihn auszuführen.
  • Die Ausführung wird bis zur Aufzählung verzögert.
  • Es funktionieren nur übersetzbare Operationen; beliebige Methoden können fehlschlagen.

Häufig gestellte Fragen

Ist die Lektion „Expression Trees in LINQ-Providern“ kostenlos?

Ja — der vollständige Text von „Expression Trees in LINQ-Providern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Expression Trees in LINQ-Providern“?

Sehen Sie, wie Provider Expressions in Abfragen übersetzen. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Expression Trees in LINQ-Providern“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was sind Expression Trees
  2. Expressions manuell erstellen
  3. Expressions kompilieren und ausführen
  4. Expression Trees in LINQ-Providern
← Zurück zu C# Academy