English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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:
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.
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:
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.
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);
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.
Daher können Sie auf diese WeiseyieldErstellen Sie benutzerdefinierte Methoden mit Schlüsselwörtern, um den Vorteil der verzögerten Ausführung zu nutzen.