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

LINQ 지연 실행 쿼리

지연 실행은 표현식의 평가가 실제로 필요할 때까지 지연되는 것을 의미합니다. 불필요한 실행을 피하여 성능을 크게 향상시킵니다。

지연 실행은 어떤 메모리 집합 및 리모트 LINQ 제공자에도 적용됩니다. 예를 들어 LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML과 같은.

다음 예제를 사용하여 지연 실행을 이해해 보겠습니다:

지연 실행

위의 예제에서 foreach 루프를 사용하여 반복할 때 쿼리가 구현되고 실행된 것을 볼 수 있습니다. 이는 지연 실행이라고 합니다. 실제로 집합의 각 객체를 접근하고 처리할 때 LINQ가 studentList 집합을 처리합니다。

지연 실행은 최신 데이터를 반환합니다

지연 실행이 항상 최신 데이터를 반환하는지 확인하려면 foreach 루프 뒤에 또 한 명의 청소년 학생을 추가하고 청소년 학생 목록을 확인하십시오:

지연 실행

보이는 것처럼 두 번째 foreach 루프는 다시 쿼리를 실행하고 최신 데이터를 반환합니다. 지연 실행은 매번 실행될 때 다시 계산되며, 이는불완전한 평가입니다. 이는 지연 실행의 주요 장점 중 하나입니다: 항상 최신 데이터를 제공합니다。

지연 실행 구현

c#의 yield IEnumerable에 대한 사용자 정의 확장 메서드 구현은 지연 실행을 수행합니다。

예를 들어, IEnumerable에 사용자 정의 확장 메서드 GetTeenAgerStudents를 구현할 수 있습니다. 이 메서드는 모든 청소년 학생 목록을 반환합니다。

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

请注意,每当GetTeenAgerStudents()가 호출될 때마다, 우리는 컨트롤台中 학생 이름을 출력합니다。

지금부터 다음 확장 메서드를 사용할 수 있습니다:

    C#:

IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", age = 13 },
            new Student() { StudentID = 2, StudentName = "Steve", 15 },
            new Student() { StudentID = 3, StudentName = "Bill", 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);
출력:
student John에 접근
학생 이름: John
student Steve에 접근
학생 이름: Steve
student Bill에 접근
학생 이름: Bill
student Ram에 접근
student Ron에 접근

출력에서 볼 수 있듯이, foreach 루프로 studentList를 순회하면 GetTeenAgerStudents()가 호출됩니다

지연 실행

따라서 이 방식으로, 다음과 같이 사용할 수 있습니다yield지연 실행의 장점을 얻기 위해 사용자 정의 메서드를 생성하는 키워드