English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ-verzögerte Ausführung der Abfrage

Delayed Execution bedeutet, dass die Auswertung der Ausdrücke bis zum tatsächlichen Bedarf verzögert wird. Dies verbessert die Leistung erheblich, indem unnötige Ausführungen vermieden werden.

Delayed Execution ist für jede Speicher Sammlung und Remote LINQ-Anbieter geeignet, wie z.B. LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML und andere.

Lassen Sie uns mit dem folgenden Beispiel das Delayed Execution verstehen:

verzögerte Ausführung

Im obigen Beispiel können Sie sehen, dass die Abfrage bei der Iteration mit dem foreach-Loop bereits realisiert und ausgeführt wird. Dies wird als Delayed Execution bezeichnet. Wenn Sie tatsächlich jeden Objekt in der Sammlung abrufen und verarbeiten, verarbeitet LINQ die Sammlung studentList.

Delayed Execution gibt die neuesten Daten zurück

Um zu überprüfen, ob die Delayed Execution immer die neuesten Daten zurückgibt, fügen Sie nach dem foreach-Loop einen weiteren jugendlichen Schüler hinzu und überprüfen Sie die Liste der jugendlichen Schüler:

verzögerte Ausführung

Wie Sie sehen können, führt der zweite foreach-Loop erneut die Abfrage aus und gibt die neuesten Daten zurück. Delayed Execution wird bei jedem Ausführen neu berechnet; dies wird alsLazy Evaluation. Dies ist einer der Hauptvorteile der Delayed Execution: Sie bietet Ihnen immer die neuesten Daten.

Delayed Execution umzusetzen

Sie können c# verwenden yield Die Implementierung der benutzerdefinierten Erweiterungsmethode für IEnumerable führt Delayed Execution aus.

Zum Beispiel können Sie eine benutzerdefinierte Erweiterungsmethode GetTeenAgerStudents für IEnumerable implementieren, die eine Liste aller jugendlichen Schüler zurückgibt.

public static class EnumerableExtensionMethods
{
    public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source)
    {
        foreach (Student std in source)
        {
            Console.WriteLine("Accessing student {0}", std.StudentName);
            if (std.age > 12 && std.age < 20)
                yield return std;
        }
    }
}

Bitte beachten Sie, dass bei jedem Aufruf von GetTeenAgerStudents() der Name des Schülers auf der Konsole ausgegeben wird.

Jetzt können Sie die folgenden Erweiterungsmethoden verwenden:

    C#:

IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", age = 13 },
            new Student() { StudentID = 2, StudentName = "Steve", age = 15 },
            new Student() { StudentID = 3, StudentName = "Bill", age = 18 },
            new Student() { StudentID = 4, StudentName = "Ram" , age = 12 },
            new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } 
        };
            
var teenAgerStudents = from s in studentList.GetTeenAgerStudents() 
                        select s;
foreach (Student teenStudent in teenAgerStudents)
    Console.WriteLine("Student Name: {0}", teenStudent.StudentName);
Ausgabe:
Zugriff auf student John
Student Name: John
Zugriff auf student Steve
Student Name: Steve
Zugriff auf student Bill
Student Name: Bill
Zugriff auf student Ram
Zugriff auf student Ron

Wie aus dem Ausgabebildschirm zu sehen ist, wird GetTeenAgerStudents() aufgerufen, wenn Sie die foreach-Schleife durch die studentList iterieren.

verzögerte Ausführung

Daher können Sie auf diese WeiseyieldErstellen Sie benutzerdefinierte Methoden mit Schlüsselwörtern, um den Vorteil der verzögerten Ausführung zu nutzen.