LINQ 延遲執(zhí)行查詢

延遲執(zhí)行意味著表達(dá)式的求值被延遲到實(shí)際需要的時(shí)候。它通過避免不必要的執(zhí)行,極大地提高了性能。

延遲執(zhí)行適用于任何內(nèi)存集合以及遠(yuǎn)程LINQ提供程序,例如LINQ-to-SQL,LINQ-to-Entities,LINQ-to-XML等。

讓我們使用以下示例了解延遲執(zhí)行:

延遲執(zhí)行

在上面的示例中,您可以看到在使用foreach循環(huán)進(jìn)行迭代時(shí)查詢已實(shí)現(xiàn)并執(zhí)行。這稱為延遲執(zhí)行。當(dāng)您實(shí)際訪問集合中的每個(gè)對象并對其進(jìn)行處理時(shí),LINQ會(huì)處理studentList集合。

延遲執(zhí)行將返回最新數(shù)據(jù)

要檢查每次延遲執(zhí)行是否每次都返回最新數(shù)據(jù),請?jiān)趂oreach循環(huán)后再添加一名青少年Ager學(xué)生,并檢查青少年學(xué)生列表:

延遲執(zhí)行

正如您看到的,第二個(gè)foreach循環(huán)再次執(zhí)行查詢并返回最新數(shù)據(jù)。延遲執(zhí)行在每次執(zhí)行時(shí)重新計(jì)算;這被稱為惰性求值。這是延遲執(zhí)行的主要優(yōu)點(diǎn)之一:它總是為您提供最新的數(shù)據(jù)。

實(shí)現(xiàn)延遲執(zhí)行

您可以使用c#的 yield 關(guān)鍵字為IEnumerable的自定義擴(kuò)展方法實(shí)現(xiàn)延遲執(zhí)行。

例如,您可以為IEnumerable實(shí)現(xiàn)自定義擴(kuò)展方法GetTeenAgerStudents,該方法將返回所有青少年學(xué)生的列表。

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

請注意,每當(dāng)GetTeenAgerStudents()被調(diào)用時(shí),我們都會(huì)在控制臺上打印學(xué)生姓名。

現(xiàn)在,您可以使用以下擴(kuò)展方法:

    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 Name: {0}", teenStudent.StudentName);
輸出:
Accessing student John
Student Name: John
Accessing student Steve
Student Name: Steve
Accessing student Bill
Student Name: Bill
Accessing student Ram
Accessing student Ron

從輸出中可以看到,GetTeenAgerStudents()當(dāng)您使用foreach循環(huán)迭代studentList時(shí),將被調(diào)用。

延遲執(zhí)行
延遲執(zhí)行

因此,通過這種方式,您可以使用yield關(guān)鍵字創(chuàng)建自定義方法,以獲得延遲執(zhí)行的優(yōu)勢。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清