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

Requête LINQ exécutée en différé

L'exécution différée signifie que l'évaluation de l'expression est différée jusqu'au moment où elle est réellement nécessaire. Elle améliore grandement les performances en évitant des exécutions inutiles.

L'exécution différée s'applique à toutes les collections en mémoire ainsi qu'aux fournisseurs LINQ distants, tels que LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML, etc.

Laissez-nous comprendre l'exécution différée à l'aide d'un exemple suivant :

exécution en différé

Dans cet exemple, vous pouvez voir que lors de l'itération avec le foreach, la requête a été mise en œuvre et exécutée. Cela s'appelle l'exécution différée. Lorsque vous accédez réellement à chaque objet dans la collection et que vous le traitez, LINQ traite la collection studentList.

L'exécution différée retourne les données les plus récentes

Pour vérifier si l'exécution différée retourne toujours les données les plus récentes à chaque fois, ajoutez un étudiant adolescent supplémentaire après le foreach et vérifiez la liste des étudiants adolescents :

exécution en différé

Comme vous le voyez, le deuxième foreach itère à nouveau la requête et retourne les données les plus récentes. L'exécution différée recalcule à chaque exécution ; cela s'appelleÉvaluation paresseuse. C'est l'un des principaux avantages de l'exécution différée : elle vous fournit toujours les données les plus récentes.

réaliser l'exécution différée

Vous pouvez utiliser c# de yield La mise en œuvre de l'exécution différée pour les méthodes d'extension personnalisées avec le mot-clé IEnumerable.

Par exemple, vous pouvez réaliser une méthode d'extension personnalisée GetTeenAgerStudents pour IEnumerable, qui retourne la liste de tous les étudiants adolescents.

public static class EnumerableExtensionMethods
{
    public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source)
    {
        foreach (Student std in source)
        {
            Console.WriteLine("Accès à l'étudiant {0}", std.StudentName);
            if (std.age > 12 && std.age < 20)
                yield return std;
        }
    }
}

Veuillez noter que chaque fois que GetTeenAgerStudents() est appelé, nous imprimons le nom des étudiants sur le console.

Maintenant, vous pouvez utiliser les méthodes d'extension suivantes :

    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("Nom de l'étudiant: {0}", teenStudent.StudentName);
Output :
Accès à l'étudiant John
Nom de l'étudiant: John
Accès à l'étudiant Steve
Nom de l'étudiant: Steve
Accès à l'étudiant Bill
Nom de l'étudiant: Bill
Accès à l'étudiant Ram
Accès à l'étudiant Ron

Comme on peut le voir à l'output, GetTeenAgerStudents() est appelé lorsque vous itérez studentList avec une boucle foreach.

exécution en différé

De cette manière, vous pouvez utiliseryieldCréez des méthodes personnalisées avec des mots-clés pour obtenir l'avantage de l'exécution en différé.