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

Позднее выполнение запросов LINQ

Отложенное выполнение означает, что оценка выражения откладывается до тех пор, пока это действительно необходимо. Это极大地提高了性能, так как avoids избыточного выполнения.

Отложенное выполнение применяется ко всем集合ам памяти и удаленным поставщикам LINQ, таким как LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML и т.д.

Давайте рассмотрим следующий пример, чтобы понять ленивое выполнение:

задержанное выполнение

В примере выше вы можете увидеть, что запрос выполняется и выполняется при итерации foreach. Это называется ленивым выполнением. Когда вы фактически посещаете каждый объект в集合е и обрабатываете его, LINQ обрабатывает集合 studentList.

Ленивое выполнение вернет最新ные данные

Чтобы проверить, всегда ли ленивое выполнение возвращает最新ные данные, добавьте еще одного подростка в цикл foreach и проверьте список студентов-подростков:

задержанное выполнение

Как вы видите, второй цикл foreach снова выполняет запрос и возвращает的最新ные данные. Ленивое выполнение пересчитывается каждый раз при выполнении; это называетсяЛенивая оценка. Это один из основных преимуществ ленивого выполнения: он всегда предоставляет вам最新的 данные.

для реализации ленивого выполнения

Вы можете использовать в C#: yield Реализация расширяемого метода с ключевым словом IEnumerable выполняет ленивое выполнение.

Например, вы можете реализовать пользовательский расширяемый метод GetTeenAgerStudents для IEnumerable, который вернет список всех студентов-подростков.

public static class EnumerableExtensionMethods
{
    public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source)
    {
        foreach (Student std in source)
        {
            Console.WriteLine("Доступ к студенту {0}", std.StudentName);
            if (std.age > 12 && std.age < 20)
                yield return std;
        }
    }
}

Обратите внимание, что каждый раз, когда вызывается GetTeenAgerStudents(), мы печатаем имя студента на экране.

Теперь вы можете использовать следующие расширяемые методы:

    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("Имя студента: {0}", teenStudent.StudentName);
Вывод:
Доступ к студенту John
Имя студента: John
Доступ к студенту Steve
Имя студента: Steve
Доступ к студенту Bill
Имя студента: Bill
Доступ к студенту Ram
Доступ к студенту Ron

Как можно увидеть из вывода, при использовании цикла foreach для итерации studentList вызывается GetTeenAgerStudents().

задержанное выполнение

Таким образом, вы можете использоватьyieldСоздайте пользовательские методы с помощью ключевых слов, чтобы получить преимущества задержанного выполнения.