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

Esecuzione differita delle query LINQ

L'esecuzione differita significa che l'evaluazione dell'espressione è differita fino al momento in cui è effettivamente necessario. Questo evita l'esecuzione non necessaria e migliora notevolmente le prestazioni.

L'esecuzione differita è applicabile a qualsiasi insieme di memoria e ai provider LINQ remoto, come LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML e altri.

Facciamo un esempio per comprendere l'esecuzione differita:

Esecuzione differita

Nell'esempio sopra, è possibile vedere che la query è stata implementata ed eseguita durante l'iterazione con il ciclo foreach. Questo viene chiamato esecuzione differita. Quando si accede effettivamente a ogni oggetto nella raccolta e si esegue il trattamento, LINQ gestisce la raccolta studentList.

L'esecuzione differita restituirà i dati più recenti

Per verificare che l'esecuzione differita restituisca sempre i dati più recenti, aggiungere un altro studente adolescente alla fine del ciclo foreach e verificare l'elenco degli studenti adolescenti:

Esecuzione differita

Come visto, il secondo ciclo foreach esegue nuovamente la query e restituisce i dati più recenti. L'esecuzione differita ricomputa ogni volta che viene eseguita; questo viene chiamatoValutazione lenta. Questo è uno dei principali vantaggi dell'esecuzione differita: fornisce sempre i dati più recenti.

per implementare l'esecuzione differita

È possibile utilizzare in C# yield L'implementazione del metodo di estensione personalizzato per IEnumerable utilizza l'esecuzione differita.

Ad esempio, è possibile implementare un metodo di estensione personalizzato GetTeenAgerStudents per IEnumerable, che restituirà l'elenco di tutti gli studenti adolescenti.

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

Si prega di notare che ogni volta che GetTeenAgerStudents() viene chiamato, stampiamo il nome dello studente sulla console.

Ora, è possibile utilizzare i seguenti metodi estesi:

    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("Nome dello studente: {0}", teenStudent.StudentName);
Output:
Accedendo al studente John
Nome dello studente: John
Accedendo al studente Steve
Nome dello studente: Steve
Accedendo al studente Bill
Nome dello studente: Bill
Accedendo al studente Ram
Accedendo al studente Ron

Come si può vedere dall'output, GetTeenAgerStudents() viene chiamato quando si itera su studentList con un ciclo foreach.

Esecuzione differita

Quindi, in questo modo, è possibile utilizzareyieldCreare metodi personalizzati con parole chiave per ottenere vantaggi di esecuzione differita.