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

LINQ 延迟実行クエリ

遅延実行は、実際に必要なときにまで計算を遅延させることで、不必要な実行を避け、パフォーマンスを大幅に向上させます。

遅延実行は、任何のメモリコレクションおよびリモートLINQプロバイダー(例えばLINQ)に適用されます。-to-SQL、LINQ-to-Entities、LINQ-to-XMLなど。

以下の例を使用して遅延実行を理解してみましょう:

遅延実行

上記の例では、foreachループを使用して迭代を行う際にクエリが実行および実行されたことがわかります。これは遅延実行と呼ばれます。実際にコレクション内の各オブジェクトにアクセスし処理を行うとき、LINQがstudentListコレクションを処理します。

遅延実行は最新のデータを返します

遅延実行が常に最新のデータを返すか確認するには、foreachループの後に青少年Ager学生を追加し、青少年学生リストを確認してください:

遅延実行

ご覧の通り、2番目のforeachループで再度クエリを実行し、最新のデータを返します。遅延実行は毎回実行時に再計算される;これは惰性求値。これは遅延実行の主な利点の1つです:常に最新のデータを提供します。

遅延実行を実装

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("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", 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 名前: {0}", teenStudent.StudentName);
出力:
student ジョンへのアクセス
Student 名前: ジョン
student スティーブへのアクセス
Student 名前: スティーブ
student ビルへのアクセス
Student 名前: ビル
student ラムへのアクセス
student ロンへのアクセス

出力から見ると、foreach ループを使用して studentList を反復処理する場合、GetTeenAgerStudents() が呼び出されます。

遅延実行

そのため、この方法で、以下を使用できます。yieldキーワードを使用してカスタムメソッドを作成し、遅延実行の利点を得ます。