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

استعلامات LINQ متأخرة التنفيذ

التأخير في التنفيذ يعني تأخير حساب التعبير إلى اللحظة التي تحتاج إليها فعليًا. إنه يعزز الأداء بشكل كبير عن طريق تجنب التنفيذ غير الضروري.

التأخير في التنفيذ ينطبق على أي مجموعة ذاكرة وبرامج LINQ البعيدة، مثل LINQ-to-SQL،LINQ-to-Entities،LINQ-to-XML وما إلى ذلك.

لنستخدم المثال التالي لفهم التأخير:

التنفيذ المتأخر

في المثال السابق، يمكنك رؤية أن الاستعلام تم تنفيذه وتنفيذه باستخدام دائرة foreach. يُسمى هذا التأخير.

سيقوم التأخير بإرجاع أحدث البيانات

لإجراء فحص تأكد من أن التأخير يعيد دائمًا أحدث البيانات، يمكنك إضافة طالب مراهق آخر بعد دائرة foreach، وفقًا لقائمة طلاب المراهقة:

التنفيذ المتأخر

كما ترون، يعاد تنفيذ الدائرة الثانية من foreach تنفيذ الاستعلام ويعيد أحدث البيانات. يتم إعادة حساب التأخير في كل مرة يتم تنفيذه؛ ويُسمى هذاالطلب التأخيري. هذا هو من بين مزايا التأخير الرئيسية: إنه يقدم دائمًا أحدث البيانات.

لتنفيذ التأخير

يمكنك استخدام 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", 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("اسم الطلاب: {0}", teenStudent.StudentName);
الناتج:
الوصول إلى الطلاب John
اسم الطلاب: John
الوصول إلى الطلاب Steve
اسم الطلاب: Steve
الوصول إلى الطلاب Bill
اسم الطلاب: Bill
الوصول إلى الطلاب Ram
الوصول إلى الطلاب Ron

من خلال النظر في الناتج، سيتم استدعاء GetTeenAgerStudents() عند استخدام cycle foreach لاستدعاء studentList.

التنفيذ المتأخر

لذلك، من خلال هذه الطريقة، يمكنك استخدامyieldأنشئ طرق مخصصة باستخدام الكلمات المفتاحية للحصول على ميزة التنفيذ المتأخر.