بناء جملة الاستعلام LINQ مقابل أسلوب البناء (C#)

معظم الاستعلامات في مقدمة LINQوثائق مكتوبة كـ الاستعلام تعبيرات باستخدام بناء جملة الاستعلام مصرحة المقدمة في C# 3.0. على الرغم من ذلك، قام وقت.NET تشغيل اللغة العامة (CLR) لا notion من استعلام بناء الجملة في نفسه. ولذلك، يتم فيه ترجمة تعبيرات الاستعلام في وقت التحويل البرمجي إلى شيء ما فهم CLR: أسلوب المكالمات. تسمى هذه الطرق عوامل تشغيل استعلام قياسي، ولديها أسماء مثل كـ Where، Select، GroupBy، Join، Max، Average، وهكذا. يمكنك الاتصال مباشرة باستخدام بناء جملة أسلوب بدلاً من بناء جملة الاستعلام.

بشكل عام، يفضل بناء جملة الاستعلام لأن ذلك هو غالباً أسهل وأكثر قابلية للقراءة؛ ولكن هناك هو لا الفرق الدلالي بين أسلوب بناء الجملة وبناء جملة الاستعلام. بالإضافة إلى بعض الاستعلامات، مثل تلك التي تقوم باسترداد عدد العناصر التي تطابق شرطا معيناً، أو التي باسترداد العنصر الذي يحتوي على القيمة القصوى في تسلسل مصدر، يمكن فقط أن يعبر أسلوب المكالمات. وثائق المرجع القياسي استعلام العوامل في System.Linqمساحة الاسم يستخدم بشكل عام طريقة بناء الجملة. ولذلك، حتى في حالة الشروع في الكتابة LINQالاستعلامات، المفيد أن تكون على دراية بكيفية استخدام بناء جملة أسلوب في الاستعلامات وتعبيرات الاستعلام أنفسهم.

وظائف ملحق مشغل الاستعلامات القياسي

يظهر المثال التالي على تعبير استعلام بسيط والاستعلام المكافئ دلالياً يكتب على استعلام مبني على الأسلوب .

class QueryVMethodSyntax
{
    static void Main()
    {
        int[] numbers = { 5, 10, 8, 3, 6, 12};

        //Query syntax:
        IEnumerable<int> numQuery1 = 
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

        //Method syntax:
        IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

        foreach (int i in numQuery1)
        {
            Console.Write(i + " ");
        }
        Console.WriteLine(System.Environment.NewLine);
        foreach (int i in numQuery2)
        {
            Console.Write(i + " ");
        }

        // Keep the console open in debug mode.
        Console.WriteLine(System.Environment.NewLine);
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/*
    Output:
    6 8 10 12
    6 8 10 12
 */

The إخراج من the الثاني أمثلة هو identical. You can see that the نوع of the استعلام متغير هو the same في كلاهما forms: IEnumerable<T>.

إلى understand the أسلوب-based استعلام, ترك's examine it المزيد closely. تشغيل the جانب أيمن of the تعبير, notice that the where clause هو now expressed كـ an مثيل أسلوب تشغيل the numbers كائن, which كـ you will recall has a نوع of IEnumerable<int>. If you are familiar مع the generic IEnumerable<T> واجهة, you know that it does not have a Where أسلوب. على الرغم من ذلك، إذا قمت باستدعاء قائمة التحسس الذكي إكمال في IDE Studio Visual Basic، ستشاهد ليس فقط على Whereالأسلوب، ولكن كثير غير ذلك الأساليب مثل Select، SelectMany، Join، و Orderby. هذه هي الجميع عوامل تشغيل استعلام قياسي.

مشغلات الاستعلامات القياسية في Intellisense

على الرغم من أنه يبدو كما لو كان IEnumerable<T>لقد تم إعادة تعريف تضمين هذه الطرق الإضافية، في الواقع th هو هو ليس في هذه الحالة. يتم تنفيذ عوامل التشغيل الاستعلام القياسية كـ نوعا جديداً من أسلوب استدعاء الأساليب الملحق . وظائف ملحقات "توسيع" نوع موجود؛ ويمكن استدعاء كـ إذا كانت وظائف مثيل تشغيل النوع. توسيع عوامل الاستعلام stوard IEnumerable<T>و هو لماذا يمكنك كتابة numbers.Where(...).

إلى الشروع في استخدام LINQ، كافة أن لديك بالفعل إلى معرفته حول وظائف الملحق هو كيفية إلى إحضار لهم إلى نطاق في تطبيق الخاص بك باستخدام الصحيح usingتوجيهات. وهذا هو شرح بالإضافة إلى ذلك في كيفية القيام بما يلي: إنشاء مشروع LINQ.. من نظر تطبيق الخاص بك، أسلوب ملحق و أسلوب مثيل عادية هي نفسها.

و لمزيد من المعلومات حول الأساليب الموسعة ، راجع أساليب ملحق (C# البرمجة الدليل). لمزيد من المعلومات حول عوامل استعلام قياسية، راجع نظرة عامة على مشغلات استعلام قياسية. بعض LINQالموفرين، مثل مكون LINQ to SQLو مكون LINQ to XML، تنفيذ عوامل تشغيل الاستعلام القياسية الخاصة بهم وأساليب ملحق إضافي غير ذلك يكتب بالإضافة إلى IEnumerable<T>.

تعبيرات لامدا

في المثال السابق، لاحظ أنه التعبير الشرطي ( num % 2 == 0) هو pكـsed كـ وسيطة في السطر إلى Whereأسلوب: Where(num => num % 2 == 0). Th هو التعبير مضمنة هو تسمى التعبير لامدا. هو طريقة ملائمة لكتابة التعليمات البرمجية التي قد otherwهوe من الضروري أن يكتب بشكل أكثر cumbersome أسلوب مجهول أو مفوض عام أو في شجرة تعبير. في C# =>هو operaإلىr لامدا، والتي يتم قراءتها ك "تذهب إلى". numتشغيل الجانب الأيسر من operaإلىr هو المتغير إدخال الذي يتطابق مع إلى numفي تعبير الاستعلام. يمكن الاستدلال المحول البرمجي النوع numلأن يعلم التي numbersهو عام IEnumerable<T>النوع. نص لامدا هو تماما نفس كالتعبير في بناء جملة الاستعلام أو في C# تعبير أو عبارة; غير ذلك يمكن أن تشمل لاستدعاءات الأسلوب ومنطق الغير ذلك المعقدة. "قيمه الارجاع" هو نتيجة التعبير فقط.

إلى الشروع في استخدام LINQ، لم يكن إلى استخدام lambdas بشكل مكثف. ومع ذلك، استعلامات معينة يمكن فقط يمكن التعبير عنها في بناء جملة أسلوب و تتطلب بعض تلك التعبيرات لامدا. بعد أن تصبح أكثر دراية ب lambdas، ستجد أن تكون فعالة و أداة مرنة في جهاز LINQمربع الأدوات. لمزيد من المعلومات، راجع التعبيرات لامدا (C# البرمجة الدليل).

composability استعلامات

في مثال التعليمة البرمجية السابقة، التي لا OrderByأسلوب هو استدعاء باستخدام عامل التشغيل نقطة تشغيل الاستدعاء Where. Whereتنتج سلسلة مصفاة و ثمOrderbyتعمل تشغيل هذا التسلسل بفرز it. لأن الاستعلامات بالرجوع IEnumerable، قمت بإنشاء هذه في أسلوب بناء الجملة بتسلسل أسلوب يستدعي معا. Th هو هو المحول البرمجي ماذا في الخلفية عند كتابة الاستعلامات باستخدام بناء جملة الاستعلام. ونظرا لعدم تخزين متغير استعلام نتائج الاستعلام، يمكنك تعديله أو استخدامه كـ bكـis للحصول على استعلام جديد في أي وقت، حتى بعد ذلك h كـ تم تنفيذها.

راجع أيضًا:

موارد أخرى

الشروع في استخدام LINQ في #C